我是bash的新手,我正在学习它,我对使用$@
和S*
之间的真正区别表示怀疑。
我在这里红了Bash Special Parameters
我知道两者都扩展到位置参数,但差异发生在双引号内。
顺便说一句"$@" = "$1" "$2"..."$n"
可能与"S*" = "$1$2...$n".
我尝试用一个简单的脚本来理解它:
if [ $# -gt 0 ]; then
echo "Your command line contains $# arguments"
else
echo "Your command line contains no arguments"
exit fi
echo "Params are: "
echo $@
echo $*
echo "$@"
echo "$*"
如果我在终端中执行我的脚本,如~./my_script par1 par2 par3
结果总是一样的:
Params are:
par1 par2 par3
par1 par2 par3
par1 par2 par3
par1 par2 par3
也许我不明白这两个特殊变量的实际用途以及我的例子是否正确。我想用一个很好的例子来弄清楚这一点。
答案 0 :(得分:4)
当您使用echo
时,它们可能看起来相同,但这是因为echo
对它们的处理方式相同而且不相同。
如果将使用bash脚本的三个命令行参数传递给C程序
./my_c $@
,
您会得到结果ARGV[1] == "par1"
ARGV[2] == "par2"
ARGV[3] == "par3"
。
如果使用./my_c $*
将给予bash脚本的三个命令行参数传递给C程序,
你得到的结果是ARGV[1] == "par1 par2 par3"
。
(ARGV
是C中提供的参数数组,第一个元素始终是调用程序的命令名称)
这将允许您在后面的脚本中使用给定参数执行的操作具有更大的灵活性。
答案 1 :(得分:3)
来自http://tldp.org/LDP/abs/html/refcards.html:
“$ *”所有位置参数(作为单个单词)*
“$ @”所有位置参数(作为单独的字符串)
此代码显示:给定一个字符串,其中的项目用空格分隔,$@
将每个单词视为新项目,而$*
将它们全部视为相同的参数。
echo "Params for: \$@"
for item in "${@}"
do
echo $item --
done
echo "Params for : \$*"
for item in "${*}"
do
echo $item --
done
测试:
$ ./a par1 par2 par3
Your command line contains 3 arguments
Params for: $@
par1 --
par2 --
par3 --
Params for : $*
par1 par2 par3 --