在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

综上所述,$@ 和 $* 在未加引号时表现一致,加引号后行为不同。若要对每个参数分别处理,推荐使用 "$@";若要把所有参数作为一个整体处理,可使用 "$*"

你可能感兴趣的:(chrome,前端,shell)