【问题标题】:Bash: How to escape $@?Bash:如何逃避 $@?
【发布时间】:2011-06-01 22:24:28
【问题描述】:

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

小例子:

$ cat >proxy.sh #!/bin/bash ./script.sh $@ ^D $ chmod +x 代理.sh $猫>脚本.sh #!/bin/bash 回声一个 $1 回声两个 $2 回声三 $3 ^D $ chmod +x 脚本.sh

这种幼稚的方法不适用于带空格的参数:

$ ./proxy.sh "a b" c 一个 二乙 三个c

预期:

$ ./proxy.sh "a b" c 一个 a b 两个 c 三

我应该在proxy.sh 中写些什么才能发生这种情况?

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

【问题讨论】:

  • "...它的所有参数是否应该完整地传递给另一个程序。" ——这是笔误吗?你想说什么?
  • "...应该 pass 它的所有参数..." 已修复,抱歉。

标签: bash escaping command-line-arguments


【解决方案1】:

引用$@,改成"$@"

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

./script.sh "$@"
^D

然后它保留原来的引号:

one a b
two c
three

【讨论】:

  • 它有效,谢谢。我没想到,我认为这会将所有参数粘合到一个...我猜需要阅读 Bash 语法。
  • 这是正确的。 $@ 必须始终被引用,否则它不会做你想做的事(它与 $* 做同样的事情,这通常是一个错误)。
  • 如果要保留空格,还必须将所有其他变量括在“双引号”中。除极少数情况外,请始终写为"$var" 而不是$var
  • ssh -t some-host -C "some-command $@" 是否根据需要引用 $@
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多