Linux脚本参数$#,$$,$n,$@,$*区别

看过又忘了,记性不好,还是记下来吧。

大概总结一下:

变量名含义
$0表示当前脚本的文件名
$n传递给脚本的第几个参数,n表示第几个, n >= 1
$#表示参数的个数
$*表示所有的参数,注意与 "$*" 的区别
$@表示所有的参数, 注意与 "$@", "$*"的区别
$$表示当前正在执行进程的PID
$?表示上一个命令的执行结果, 0表示正常,非0表示异常

几个注意点:

1. 关于$0:

表示当前脚本的文件名, 但脚本的执行方式不同,可能 $0 获取到的值也不同:

sh dir/test.sh  #$0值为 dir/test.sh
sh test.sh      #$0值为test.sh
./test.sh       #$0值为./test.sh
2. 关于$#:

注意参数的个数,如果用 "" 包裹,则算做一个参数,除此之外用空格隔开的就算一个参数:

sh test.sh "1 2 3" 4 5 abc 9 #$#的值为5"1 2 3"算一个,4算一个,5算一个,abc算一个,9 算一个
3. 关于$*和$@:

在使用时$*和$@都未使用""括起来时,他们的含义是一样的:

sh test.sh "1 2 3" 4 5 abc 9

#假设test.sh 包含如下内容:
#验证$*
for var in $*
do
        echo "$var"
done

#验证$@
for var in $@
do
        echo "$var"
done

他们输出的结果相同,都为:

1
2
3
4
5
abc
9

注意:他们会忽略"", 也就是虽然$#的值为5,但是却输出了7行。

在使用$* 用括号括起来时,也就是"$*"时,会将所有参数作为一个整体输出:

sh test.sh "1 2 3" 4 5 abc 9

#假设test.sh 包含如下内容:
#验证"$*"
for var in "$*"
do
        echo "$var"
done

输出结果如下, for循环只执行了一次:

1 2 3 4 5 abc 9

在使用$@ 用括号括起来时,也就是 "$@"时,会将参数分别输出,但是会将""括起来的参数整体输出:

sh test.sh "1 2 3" 4 5 abc 9

#假设test.sh 包含如下内容:
#验证"$@"
for var in "$@"
do
        echo "$var"
done

输出结果如下, for 循环执行了5次,次数恰好跟 $#的值相同:

1 2 3
4
5
abc
9
4. 将$*,$@赋值给变量:
sh test.sh "1 2 3" 4 5 abc 9

res=$@
res1="$@"
res2=$*
res3="$*"
for var  in $res
do
        echo "$var"
done

for var1 in $res1
do
        echo "$var1"
done

for var2 in $res2
do
        echo "$var2"
done

for var3 in $res3
do
        echo "$var3"
done

四种方式输出结果均相同:

1
2
3
4
5
abc
9

形如for var3 in $res3 和 for var3 in “$res3” 却是不同的结果。
在写脚本时注意for … in y 这种,不要将y带上双引号,否则循环只会执行一次,不是想要的结果。

到此结束。


版权声明:本文为dcj199411原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。