2016-05-06 42 views
0

谁可以帮助给出一个shell脚本示例来显示$*[email protected]之间的区别?

以下是我的脚本,它无法分辨。任何人都可以举一个好榜样?

$ cat internalVar.sh 
#!/bin/bash 
# internalVar.sh var1 var2 
echo "\$? = " $? 
export IFS="_" 
echo "\[email protected] = " [email protected] " == several parameters?" 
j=1 
for i in [email protected] 
do 
    echo "var $j = $i" 
    j=$((j+1)) 
done 
echo "\$* = " $* " == a single string" 
j=1 
for i in $* 
do 
    echo "var $j = $i" 
    j=$((j+1)) 
done 
echo "\$# = " $# 
echo "\$0 = " $0 
echo "\$$ = " $$ 


$ export IFS="c" 
[$ ./internalVar.sh par1 "par meter 2" par3 
$? = 0 
[email protected] = par1 par meter 2 par3 == several parameters? 
var 1 = par1 
var 2 = par meter 2 
var 3 = par3 
$* = par1 par meter 2 par3 == a single string 
var 1 = par1 
var 2 = par meter 2 
var 3 = par3 
$# = 3 
$0 = ./internalVar.sh 
$$ = 4638 
+1

您的脚本无法区分它的差异,因为它没有使用适当的引号。如果没有正确引用,那么**就没有区别(并且会有很多错误)。 –

+0

@CharlesDuffy Duh,当然有重复。我一定以为“这不是问'var = val',它一定是新的;) –

+0

谢谢你们,我明白了。 –

回答

3

这样如何:

$ set 'arg1a arg1b' 'arg2a arg2b' 'arg3a arg3b' 
$ for arg in "[email protected]"; do echo "$arg"; done 
arg1a arg1b 
arg2a arg2b 
arg3a arg3b 
$ for arg in "$*"; do echo "$arg"; done 
arg1a arg1b arg2a arg2b arg3a arg3b 
$ for arg in [email protected]; do echo "$arg"; done 
arg1a 
arg1b 
arg2a 
arg2b 
arg3a 
arg3b 
$ for arg in $*; do echo "$arg"; done 
arg1a 
arg1b 
arg2a 
arg2b 
arg3a 
arg3b 

此循环通过扩张,这在第一种情况下"[email protected]"为每个位置参数的单独参数,以及在第二种情况下"$*"一个字符串。

第三个和第四个案例,未加引号的情况下,执行分词并且彼此没有区别。

另请参阅the manual“特殊参数”。