如何在 bash 中将多个参数传递给单个变量?

如何在 bash 中将多个参数传递给单个变量?

我安装了两个版本的python。因此,如果我需要使用 pip 下载软件包,我必须使用以下任一方法:

  1. python3.9 -m pip [args]
  2. python3.8 -m pip [args]

我想要的是我想使用pip39来代替,pythin3.9 -m以便如果我运行pip39 install somethingpip39 freeze则执行适当的命令。

我写了以下函数:

pip39(){python3.9 -m pip "$1"}

它适用于pip39 freeze因为freeze只有一个参数。但因为pip39 install something它给出了错误,因为传递了 2 个参数,并且 bash 只采用第一个参数。

那么如何放入多个args呢"$1"

答案1

在类似 Bourne 的 shell 中,"$1"扩展为函数的第一个参数(如果未在函数内部扩展,则扩展为脚本的第一个参数)或扩展为空字符串如果不是,"$2"将是第二个、"$3"第三个……"${10}"第十个,"$@"扩展到所有提供的参数。

${1+"$1"}如果提供了则扩展为第一个参数,如果没有则扩展为任何内容(甚至不是空字符串)。因此${1+"$1"} ${2+"$2"}将扩展到函数的最多 2 个第一个参数。在yashor zshshell 中,可以简化为"${@[1,2]}"(甚至简化为"$@[1,2]"in zsh)、 and in ksh93bashand zshto "${@:1:2}"

pip39() {python3.9 -m pip "$1"}桀骜然而语法。在bash或其他类似 Bourne 的 shell 中,您需要pip39() { python3.9 -m pip "$1";}(或者只是pip39() python3.9 -m pip "$1"在 Bourne shell 和大多数类似 Bourne 的 shell 中,尽管不是 bash、posh 或 yash)。

因此,在这里,在 bash (如您标记您的问题)或 zsh (如您问题中的代码语法)中,您需要:

pip39(){ python3.9 -m pip "$@";}

pip39传递to的所有参数python3.9,该代码与 Bourne 和 POSIX 兼容。

或者只传递有限数量的参数(这里以 3 个为例):

pip39(){ python3.9 -m pip "${@:1:3}"; } # ksh93, bash, zsh
pip39(){ python3.9 -m pip "${@[1,3]}"; } # zsh, yash
pip39(){ python3.9 -m pip ${1+"$1"} ${2+"$2"} ${3+"$3"}; } # any Bourne-like shell

1 不在 Bourne shell 中,您的数量限制为 9。$10要么类似于shell ${10},要么${1}0取决于 shell(不幸的是 POSIX 需要后者),因此应该避免。

相关内容