最近我正在学习 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 个标记的列表,前两个是parameter1
andparameter2
,最后一个是a whole sentence as parameter
包含空格的字符串。这是您在大多数情况下所需要的,特别是当您想将其用作标记列表时(迭代、分配给数组或传递给自定义函数)。
为了进一步阅读,特别是关于 shell 变量引用和分词的微妙之处,我建议您参考