shell脚本系列:$@ 与 $* 的区别

当 $* 和 $@ 不被双引号 " " 包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。

但是当它们被双引号" "包含时,就会有区别了:

  • "$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据;
  • "$@"仍然将每个参数都看作一份数据,彼此之间是独立的。

比如传递了 5 个参数,那么对于 $* 来说,这 5 个参数会合并到一起形成一份数据,它们之间是无法分割的;而对于 $@ 来说,这 5 个参数是相互独立的,它们是 5 份数据。

如果使用 echo 直接输出 $* 和 $@ 做对比,是看不出区别的;但如果使用 for 循环来逐个输出数据,立即就能看出区别来。

保存下面脚本为test.sh:

#!/bin/bash

echo "print each param from "$*""
for var in "$*"; do
echo "$var"
done

echo "print each param from "$@""
for var in "$@"; do
echo "$var"
done

运行 test.sh,并附带参数:

./test.sh a b c d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d

从运行结果可以发现,对于 $*,只循环了 1 次,因为它只有 1 分数据;对于 $@ ,循环了 5 次,因为它有 5 份数据。

原文地址:https://www.cnblogs.com/iuskye/p/shell-var.html