在shell脚本中,$@和$#的区别与联系
在 Shell 脚本里,$@
和 $*
都是用于表示传递给脚本或函数的所有参数,下面详细介绍它们的区别与联系。
联系
- 表示所有参数:二者都能够代表传递给脚本或者函数的全部参数。当你在执行脚本时带上了多个参数,
$@
和$*
都能把这些参数呈现出来。 - 未加引号时行为一致:在没有被双引号
" "
引用的情况下,$@
和$*
表现一样,都会把所有参数展开为以空格分隔的列表。
示例代码如下:
bash
#!/bin/bash
# 遍历 $@ 未加引号的情况
echo "未加引号时遍历 \$@"
for arg in $@; do
echo $arg
done
# 遍历 $* 未加引号的情况
echo "未加引号时遍历 \$*"
for arg in $*; do
echo $arg
done
将上述代码保存为 test.sh
,执行 bash test.sh "hello world" foo bar
,输出结果如下:
plaintext
未加引号时遍历 $@
hello
world
foo
bar
未加引号时遍历 $*
hello
world
foo
bar
区别
主要区别体现在被双引号 " "
引用时:
"$@"
:把每个参数当作独立个体来保留,它会将所有参数展开成多个独立的字符串,并且维持参数原本的分隔状态。在需要对每个参数单独处理时,使用"$@"
十分合适。"$*"
:会把所有参数合并成一个字符串,各个参数之间由IFS
(内部字段分隔符,默认是空格、制表符和换行符)的第一个字符分隔。
示例代码如下:
bash
#!/bin/bash
# 遍历 "$@"
echo "加引号时遍历 \"\$@\""
for arg in "$@"; do
echo $arg
done
# 遍历 "$*"
echo "加引号时遍历 \"\$*\""
for arg in "$*"; do
echo $arg
done
将上述代码保存为 test2.sh
,执行 bash test2.sh "hello world" foo bar
,输出结果如下:
plaintext
加引号时遍历 "$@"
hello world
foo
bar
加引号时遍历 "$*"
hello world foo bar
综上所述,$@
和 $*
在未加引号时表现一致,加引号后行为不同。若要对每个参数分别处理,推荐使用 "$@"
;若要把所有参数作为一个整体处理,可使用 "$*"