bash 中的 ${@} 是什么?

bash 中的 ${@} 是什么?

最近我正在学习 Linux 中的 bash 命令,特别是字符串操作。其中有一个局部变量声明为等于${@}。我明白那个$n是指n提供给命令的命令行参数。但 的意义是什么${@}

给出的命令是:

local instr;
instr="${@}";

答案1

在 Bash(以及所有类似 POSIX 的 shell)中,$@or${@}“特殊参数”扩展为所有位置参数(= 命令行参数)的列表。它在这方面与 类似$*,但除此之外,它还可以双引号展开为单个标记的列表,而不是包含所有由空格(1)分隔的位置参数的字符串。


(1) 实际上,参数并不是通过“空格”显式连接的,而是通过 的第一个字符($IFS输入字段分隔符变量,但在许多 shell 中默认为“空格”。在接下来的文本中,为了简单起见,我仍将使用“空格”,并假设您保留$IFS默认值或将其更改为您的需要,但知道您要做什么。


所以,

  • "$*"相当于"$1 $2 $3 ... "并被视为“一个词”,而
  • "$@"相当于"$1" "$2" "$3" ...并被视为“几个单独的单词”。

如果没有引号,两者都只是一个以空格分隔的单词列表。当命令行参数本身是带有空格的字符串时,这种区别就变得很重要,如下所示

./my_script.sh parameter1 parameter2 "a whole sentence as parameter"
  • $*$@不带引号将扩展为七个单独标记的列表。这很少是您想要的。
  • "$*"将扩展为由七个空格分隔的单词 ( parameter1 parameter2 a whole sentence as parameter) 组成的一个标记。这是大多数情况下不是你想要什么。
  • "$@"将扩展为包含 3 个标记的列表,前两个是parameter1and parameter2,最后一个是a whole sentence as parameter包含空格的字符串。这是您在大多数情况下所需要的,特别是当您想将其用作标记列表时(迭代、分配给数组或传递给自定义函数)。

为了进一步阅读,特别是关于 shell 变量引用和分词的微妙之处,我建议您参考

相关内容