Shell中 $* 和 $@ 的区别
在 shell 中,$*和 $@ 都表示命令行参数列表(即传递给脚本或函数的参数列表),但它们在展开时有一些微妙的区别。
$* 展开为所有位置参数列表,由一个单一的字符串表示,参数之间由第一个位置参数中的第一个字符分隔符(IFS 环境变量指定的字符,通常是空格)分隔。例如,如果在命令行上调用脚本 myscript.sh,并传递三个参数 "foo"、"bar" 和 "baz",则 "$*" 会展开为一个字符串 "foo bar baz"。
$@ 展开为所有位置参数列表,由多个独立的字符串表示,每个字符串对应一个位置参数。这些字符串不包含分隔符,可以用双引号括起来以保留空格等特殊字符。例如,如果在命令行上调用脚本 myscript.sh,并传递三个参数 "foo"、"bar" 和 "baz",则 "$@" 会展开为三个字符串 "foo"、"bar" 和 "baz"。
在大多数情况下,"$@" 更常用,因为它允许您保留参数中的空格和特殊字符,并将它们作为单独的参数传递给命令或函数。例如,下面的脚本会将传递给它的参数打印出来:
#!/bin/bash
for arg in "$@"
do
echo "$arg"
done
如果您将上述脚本保存为 myscript.sh,并在命令行上执行以下命令:
$ ./myscript.sh "hello world" foo bar
则输出将是:
hello world
foo
bar
如果您使用 $* 替换 $@,则会将所有参数作为单个字符串传递给 for 循环,并且将空格视为参数之间的分隔符,因此输出将是:
hello world foo bar

浙公网安备 33010602011771号