【问题标题】:quotation marks in bash script around $@? [duplicate]bash 脚本中 $@ 周围的引号? [复制]
【发布时间】:2018-06-17 18:39:53
【问题描述】:

我从How can I run a function from a script in command line?找到了以下 bash 脚本的 sn-p

$ cat test.sh
testA() {
  echo "TEST A $1";
}

testB() {
  echo "TEST B $2";
}

"$@"

这很好用。 这个答案的回复之一是Use "$@" in most cases. $@ is not safe in some cases

我想知道为什么 $@ 在最后一行需要引号 "$@" 。 在 bash 脚本中,$@ 周围有没有引号有什么区别?

【问题讨论】:

  • 如果任何参数包含空格或全局字符,那么不带引号的$@ 将产生问题
  • 重复是有意排序的——第一个的答案是最直接的。

标签: bash


【解决方案1】:

"$@" 引用每个展开的位置参数。例如:

# script.sh
cat "$@"
cat $@

如果您执行script "a b",第一个cat 将尝试发出一个字面上名为a b 的文件。由于第二个cat 没有引用位置参数,它将尝试发出名为ab 的单个文件。这可能会导致各种问题,因为用户引用了传递给script 的值并希望将其作为一个单词/单位处理。

请注意,"$@" 有点特殊,因为如果您使用script "a b" "c d",它会在脚本中扩展为:cat "a b" "c d",而不是 cat "a b c d"。第二行将执行 cat a b c d 尝试连接四个不同的文件,而不是两个名称中带有空格的文件。

【讨论】:

  • 值得注意的是,cat $@ 的行为与 cat $* 相同——只是在使用引号的情况下,结构之间的行为有任何区别。
  • (另外,您可能会考虑一个可以扩展为包含 glob 以演示该行为以及字符串拆分的示例——即。./script '* READ ME FIRST *.txt',在这种情况下$@ 或@ 987654339@ unquoted 会将**.txt 替换为当前目录中的文件列表)。
  • @CharlesDuffy 谢谢;我会留下你的评论作为一个例子。我真的只是想说明一般的差异,并指出它可能是危险的或导致意外行为。这实际上可能是任何事情,包括安全问题。
猜你喜欢
  • 2020-02-08
  • 2019-08-10
  • 2020-07-21
  • 2022-12-03
  • 2023-03-17
  • 2018-09-25
  • 1970-01-01
  • 2019-02-08
  • 2013-01-03
相关资源
最近更新 更多