在shell脚本中,$@
和$*
之间的区别是什么?
哪一个是获取脚本参数的首选方法?
不同的shell解释器之间是否存在差异?
答案 0 :(得分:59)
来自here:
$ @的行为类似于$ *,除非引用参数,如果它们中有空格,则正确分解。
以此脚本为例(取自链接的答案):
for var in "$@"
do
echo "$var"
done
给出这个:
$ sh test.sh 1 2 '3 4'
1
2
3 4
现在将"$@"
更改为$*
:
for var in $*
do
echo "$var"
done
你明白了:
$ sh test.sh 1 2 '3 4'
1
2
3
4
(使用Google找到答案)
答案 1 :(得分:13)
与我的POV的键区别在于“$ @”会保留原始号码 论点。这是唯一的形式。因为这个原因 非常方便用脚本传递args。
例如,如果文件my_script包含:
#!/bin/bash
main()
{
echo 'MAIN sees ' $# ' args'
}
main $*
main $@
main "$*"
main "$@"
### end ###
我按照这样运行:
my_script 'a b c' d e
我会得到这个输出:
MAIN看到5个args
MAIN看到5个args
MAIN看到1个args
MAIN看到3个args
答案 2 :(得分:0)
使用$ @,每个参数都是带引号的字符串。否则它的行为相同。
请参阅:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF