2012-09-07 113 views
213

在许多SO问题和bash教程我看到,我可以访问命令行参数在bash脚本中有两种方式:

$ ~ >cat testargs.sh 
#!/bin/bash 

echo "you passed me" $* 
echo "you passed me" [email protected] 

导致:

$ ~> bash testargs.sh arg1 arg2 
you passed me arg1 arg2 
you passed me arg1 arg2 

$*[email protected]有什么区别?
什么时候应该使用前者,何时使用后者?

+0

看看这个答案:http://stackoverflow.com/a/842325/671366 – codeling

+2

@nyarlathotep,谢谢,这个问题很有用。标题很糟糕。我永远不会猜测答案显示我在找什么。不知何故,我的问题确实很微不足道,但是我在头脑中制定它的方式在bash手册中找不到(尽管/ *将您带到了正确的地方......) – Oz123

回答

286

当特殊参数报价的差异出现。让我说明的差异:

$ set -- "arg 1" "arg 2" "arg 3" 

$ for word in $*; do echo "$word"; done 
arg 
1 
arg 
2 
arg 
3 

$ for word in [email protected]; do echo "$word"; done 
arg 
1 
arg 
2 
arg 
3 

$ for word in "$*"; do echo "$word"; done 
arg 1 arg 2 arg 3 

$ for word in "[email protected]"; do echo "$word"; done 
arg 1 
arg 2 
arg 3 

一个在引用的重要性进一步例如:注有“ARG”和数字2米之间的空间,但如果我不引用$字:

$ for word in "[email protected]"; do echo $word; done 
arg 1 
arg 2 
arg 3 

,并在bash,"[email protected]"是 “默认” 列表遍历:

$ for word; do echo "$word"; done 
arg 1 
arg 2 
arg 3 
+37

+1我一直认为这是概念最好通过一个简单的例子来演示,其中bash手册完全没有。 – chepner

+5

有没有可能的用例,可能需要'$ *'或'“$ *”',目的不能由'$ @'或'“$ @”'提供? – anishsane

+0

另外,'$ {arrayname [*]}'与'$ {arrayname [@]}'有区别吗? – anishsane

15

$ @与$ *相同,但每个参数都是带引号的字符串,也就是说,这些参数是完整传递的,没有解释或扩展。这意味着,除其他外,参数列表中的每个参数都被视为一个单独的单词。

当然,应该引用“$ @”。

http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

33

$ *

扩展为位置参数,从1开始。当 膨胀双引号内发生,它扩展到单个字 通过的 特殊变量IFS的第一个字符分离的每个参数的值。也就是说,“$ *”等价于“$ 1c的$ 2C ...”, 其中c是IFS变量的值的第一个字符。如果 IFS未设置,则参数由空格分隔。如果IFS为空,则 参数在不插入分隔符的情况下连接。

$ @

扩展为位置参数,从1开始。当 膨胀双引号内发生,每个参数扩展为一个单独的 字。也就是说,“$ @”相当于“$ 1”“$ 2”...如果 双引号扩展出现在一个单词内,则第一个参数的扩展与原始单词 的开头部分相连,并且最后一个参数的扩展与原始单词的最后一个 部分结合在一起。当没有位置参数时, “$ @”和$ @展开为空(即,它们被移除)。

来源:Bash man

148

一个不错的哈从Bash Hackers Wiki NDY概览表:

$* versus $@ table

如果参数存储在一个脚本变量和论证,预计包含空格,我衷心建议采用"$*" trick with the internal field separator $IFS set to tab

+32

...其中“c”是$ IFS –

+31

的第一个字符,而'$ IFS'则表示“内部字段分隔符”。 –

+0

这里是[示例](https://stackoverflow.com/a/4824637/2192488),其中包括引用的输入。输入也很重要! –