Bash:如何逃避$ @?

Ale*_*ysh 7 bash escaping command-line-arguments

我需要编写一个bash脚本,除其他外,应该将其所有参数原封不动地传递给另一个程序.

最小的例子:

$ cat >proxy.sh 
#!/bin/bash

./script.sh $@
^D

$ chmod +x proxy.sh 

$ cat >script.sh 
#!/bin/bash

echo one $1
echo two $2
echo three $3 
^D

$ chmod +x script.sh 

这种天真的方法不适用于带空格的参数:

$ ./proxy.sh "a b" c
one a
two b
three c

预期:

$ ./proxy.sh "a b" c
one a b
two c
three

proxy.sh为了实现这一点,我应该写些什么?

请注意,我不能使用别名,proxy.sh必须是一个脚本 - 它在调用之前做了一些事情script.sh.

mar*_*cog 11

引用$@,制作它"$@":

$ cat >proxy.sh 
#!/bin/bash

./script.sh "$@"
^D
Run Code Online (Sandbox Code Playgroud)

然后它保留原始报价:

one a b
two c
three
Run Code Online (Sandbox Code Playgroud)

  • 这是对的.`$ @`必须始终引用,否则它不会做你想要的(它与`$*`相同,这通常是一个bug). (5认同)
  • 如果要在其中保留空格,还必须将所有其他变量括在"双引号"中.除了极少数情况外,所以总是写"$ var"`而不是`$ var`. (3认同)