解释Bash $\* 和 $@ 有什么区别 ?
参考回答
在Bash中,$*
和 $@
都表示传递给脚本或函数的所有参数,但它们的行为在处理带引号的参数时有所不同。
$*
:$*
会将所有的位置参数作为一个单一的字符串返回,参数之间用 第一个字符(通常是空格) 分隔。- 如果用双引号包围
$*
,它会将所有参数作为一个整体,以 第一个分隔符(通常是空格) 拼接在一起。
示例:
这里,
$*
将两个参数"Hello world"
和"Bash script"
视为一个单一的字符串,参数之间用空格连接。-
$@
:$@
会将每个位置参数作为单独的字符串返回,保持原有的分隔。如果用双引号包围$@
,每个参数会被当作一个独立的单元,而不是一个合并的字符串。
示例:
当用双引号包围
$@
时,每个参数会被视为一个单独的字符串:输出:
Hello world Bash script
在这个例子中,
$@
将每个参数保持为独立的字符串。
详细讲解与拓展
-
区别:
$*
会把所有参数拼接成一个单一的字符串,参数之间用 第一个字符(默认是空格) 连接。如果你在双引号中使用$*
,它会将所有的参数连接成一个单一的字符串。$@
将每个参数作为独立的字符串处理。特别是,当你将$@
包装在双引号中时,它会将每个参数视为一个单独的整体,而不是将它们拼接成一个长字符串。
- 双引号的影响:
这是$*
和$@
最关键的区别之一。通常,当你在脚本中处理带空格的参数时,双引号的使用可以保持参数的完整性。$*
示例(不加引号):这里,
$*
会将"Hello world"
和"Bash script"
当作两个独立的参数,但它会用空格连接它们。$@
示例(不加引号):"$@"
与"$*"
的行为就有所不同:"$*"
示例:"$@"
示例:输出:
Hello world Bash script
这里,
"$@"
保持每个参数的完整性,空格不会导致它们合并成一个字符串。 -
使用场景:
$*
更常用于拼接所有参数为一个字符串,例如将所有命令行参数传递给另一个程序或脚本时:$@
更适合用于循环或处理每个单独的参数,特别是当每个参数可能包含空格时:
- 实际使用中的选择:
- 如果你处理的参数中可能包含空格,且需要保持每个参数的独立性,最好使用
"$@"
。 - 如果你只是需要将所有参数合并成一个字符串,并且不关心空格问题,可以使用
$*
。
- 如果你处理的参数中可能包含空格,且需要保持每个参数的独立性,最好使用
总结
$*
:将所有参数作为一个字符串拼接,用空格分隔。如果用双引号包裹,所有参数会被合并为一个字符串。$@
:将每个参数作为独立的字符串返回。如果用双引号包裹,保持每个参数的独立性,并且它们不会被合并。
当需要处理包含空格的参数时,使用 "$@"
是最安全的选择。