Shell特殊变量讲解:$n、$#、$*、$@、$?、$$各自代表的意思及用法
$n
-
语法:
$n
,含义:用于接收shell脚本文件执行时传入的参数。$0
#用于获取当前脚本文件名称$1~$9
#代表输入的第一个参数到第9个参数 # 这都不用括号(要也不影响)第10个以上就用 数 字 比 如 {数字} 比如 数字比如{12} # 后面这些都必须要{ }括号
简单示例编辑一个名为456.sh的shell脚本:
#!/bin/bash
echo $0
echo "输入的第一个参数:$1"
echo "输入的第二个参数:$2"
echo "输入的第11个参数:${11}"
执行:bash 456.sh 11 22 33 44 55 66 77 88 99 1010 1111
,获取的结果如下:
$#
-
语法:
$#
,含义:获取shell脚本所有输入参数的个数(输入2个就是2个)。echo "参数个数:${#}"
echo 参数个数:$#
# 里面也不一定要引号,两行效果是一样的。
Tips:
- 强烈注意:在这里面,使用单引号,里面的内容会原样输出,里面加的任何变量,无论带括号不,都是原样输出;
- 建议,使用双引号里面变量就加上{},没有引号就不要这{},(引号与{}有无在这里都没有影响)
$* and $@
- 语法:
$*
、$@
,含义:都是获取所有传入参数,用于后续输出所有参数。
区别:
-
直接原样,不用双引号括起来,那两者一样,都是原样
echo '直接输出$*:'$* # var1 var2 ... varn echo '直接输出$@:'$@ # var1 var2 ... varn # 两者是一样的
-
使用双引号括起来(不能是单引号,参上的Tips):那么
"$*"
跟上一样的,就是将这些拼接起来的字符串;而"$@"
则是一个数组,是可以一个个取的,用循环验证。
简单示例(编辑一个名为456.sh的shell脚本):
#!/bin/bash
for item in "$*" # 结果就是全部打印出来
do
echo $item
done
echo "************************"
# 这也是shell中的循环写法
for item in "$@"
do
echo $item # 这里也可以${item},但记得上面Tips
done
执行:bash 456.sh 11 nihao 123 hello abc 456
,结果如下:
$?
-
$?
,含义:用于获取上一个shell命令的退出状态码,或者是函数的返回值echo "hello" echo $? # 上一条肯定执行成功,这就会得到0
得到0就代表执行成功,非0就是不成功
$$
-
$$
,含义:用于获取当前shell环境的进程ID号-
ps aux | grep bash echo $$ # 交互式shell下,这俩都是一样的
-