我有一个 bash 脚本,它是另一个进程的简单包装:
$ cat ~/bin/s3cmd
#!/bin/sh
trickle -u 80 ~/bin/s3cmd.py $*
$
当参数不包含空格时,这非常有用。然而,每当传递给外部脚本的参数s3cmd
包含空格时,即使这些参数在命令行上被转义,它似乎也会失败。
我如何对此进行空格证明,以便每个单个参数都正确传递到s3cmd.py
?
答案1
使用"$@"
。
#!/bin/sh
trickle -u 80 ~/bin/s3cmd.py "$@"
当进行隐式分词时(几乎总是在不加引号时),$*
和is之间没有功能差异。$@
然而,当引用时,$*
是一个由 的第一个字符分隔的单个字符串IFS
,并且"$@"
是一个真正的数组(您想要的)。
$ set foo bar baz
$ IFS=c
$ printf '%s\n' "$@"
foo
bar
baz
$ printf '%s\n' "$*"
foocbarcbaz
答案2
您需要使用 $@ 而不是 $* 并引用它:
trickle -u 80 ~/bin/s3cmd.py "$@"
另请参阅Special Parameters
bash 联机帮助页中的部分。