我安装了两个版本的python。因此,如果我需要使用 pip 下载软件包,我必须使用以下任一方法:
python3.9 -m pip [args]
python3.8 -m pip [args]
我想要的是我想使用pip39
来代替,pythin3.9 -m
以便如果我运行pip39 install something
或pip39 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 个第一个参数。在yash
or zsh
shell 中,可以简化为"${@[1,2]}"
(甚至简化为"$@[1,2]"
in zsh
)、 and in ksh93
、bash
and zsh
to "${@: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 需要后者),因此应该避免。