参数拆分

use*_*ser 2 shell bash parameter quoting

我有一个 bash 脚本,它是另一个进程的简单包装器:

$ cat ~/bin/s3cmd
#!/bin/sh
trickle -u 80 ~/bin/s3cmd.py $*
$
Run Code Online (Sandbox Code Playgroud)

当参数不包含空格时,这很有效。但是,当传递给外部s3cmd脚本的参数包含空格时,它似乎会失败,即使这些在命令行上被转义。

我如何对此进行空白证明,以便将每个单个参数正确传递给s3cmd.py

Chr*_*own 6

使用"$@".

#!/bin/sh
trickle -u 80 ~/bin/s3cmd.py "$@"
Run Code Online (Sandbox Code Playgroud)

在进行隐式分词时(几乎总是未加引号时),$*$@is之间没有功能差异。但是,当引用时,它$*是由 , 的第一个字符分隔的单个字符串IFS,并且"$@"是一个真正的数组(您想要的)。

$ set foo bar baz
$ IFS=c
$ printf '%s\n' "$@"
foo
bar
baz
$ printf '%s\n' "$*"
foocbarcbaz
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在某些情况下,使用某些 shell 时,$* unquoted 和 $@ unquoted 之间可能存在差异。参见例如`set ab; IFS=; a=$@; b=$*; 在 bash 或 AT&T ksh 中回显 "$a,$b"`。另请注意,在 Bourne shell(但现在谁关心 Bourne shell)中,SPC 用于分隔“$*”中的项目,而不是 $IFS 的第一个字符。 (2认同)