看过又忘了,记性不好,还是记下来吧。
大概总结一下:
变量名 | 含义 |
---|---|
$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带上双引号,否则循环只会执行一次,不是想要的结果。
到此结束。