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