Abd*_*red 7 command-line scripting shell-script arguments
我已经阅读了脚本$@和$*. 据我了解,执行脚本时使用的参数存储在两个特殊变量中,一次所有参数都进入$@,一次所有参数都进入$*,这样它们就可以在脚本内部访问。
我不明白为什么同一组参数必须有两个特殊变量。有什么区别,什么时候使用一个特殊变量,什么时候使用另一个特殊变量?

不同之处在于两个变量的扩展方式。
$@展开,以便每个参数由 a 分隔\0NUL并单独查看。因此,给定foo arg1 arg2 arg3,$@将变为arg1\0arg2\0arg3。特别是,每个参数都受到保护,不会被分割,因此,如果arg1are foo bar,除非进行进一步处理,否则它将被视为foo barand notfoo和bar分开。
$*展开,以便每个参数由 的第一个字符IFS(内部字段分隔符)分隔。默认情况IFS下,第一个字符为空格,因此 的扩展$*通常与 的扩展相同$@。但是,如果我要设置,例如,IFS=:,那么$*将扩展到arg1:arg2:arg3。
您如何使用它们取决于具体情况。例如,这里有一个快速获得许多数字之和的技巧:
sum () (
IFS=+
echo $(( $* ))
)
Run Code Online (Sandbox Code Playgroud)
然后:
$ sum 1 2 3
6
Run Code Online (Sandbox Code Playgroud)
当然,这个技巧非常脆弱。