一、shell特殊变量

1.位置变量

位置变量
含义
$0获取当前执行的shell脚本的文件名,包括脚本路径
$n获取当前执行的shell脚本的第n个参数,n=1..9,当n为0时表示脚本的文件名,如果n大于9,用大括号括起来${10}
$*获取当前shell的所有参数,将所有的命令行参数视为单个字符串,相当于“$1$2$3”,注意与$#的区别:参数1 参数2 参数3
$#获取当前shell命令行中参数的总个数
$@这个程序的所有参数“$1” “$2” “$3” “...” ,这是将参数传递给其他程序的最佳方式,因为它会保留内嵌在每个参数里的任何空白。

2.进程状态变量

进程状态变量
含义
$$获取当前shell的进程号(PID):如1534
$!获取执行上一个指令的PID
$?获取执行的上一个指令的返回值
$_在此之前执行的命令或脚本的最后一个参数

二、举例说明

1.位置变量

$0 获取当前执行的shell脚本的文件名,包括脚本路径

[root@localhost ~]# cat 0.sh
echo $0
[root@localhost ~]# sh 0.sh
0.sh
[root@localhost ~]# sh /root/0.sh
/root/0.sh

$n

[root@localhost ~]# cat n.sh
echo $1
[root@localhost ~]# sh n.sh lele
lele
[root@localhost ~]# sh n.sh lele baobao
lele
[root@localhost ~]# sh n.sh "lele baobao"
lele baobao
[root@localhost ~]# seq 15 | sed 's#^#$#g'|tr "\n" " " > n1.sh
[root@localhost ~]#vim n1.shecho 
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@localhost ~]# sh n1.sh {a..z}
a b c d e f g h i a0 a1 a2 a3 a4 a5    #如果n大于9,用大括号括起来${10}
[root@localhost ~]# cat n1.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
[root@localhost ~]# sh n1.sh {a..z}
a b c d e f g h i j k l m n o

$*和$#

[root@localhost ~]# set -- "I am a" good teacher  #--会结束选项部分,自"I am"开启的新参数
[root@localhost ~]# echo $*
I am a good teacher
[root@localhost ~]# echo $#
3

$*和$@

[root@localhost ~]#set -- "I am a" good teacher
[root@localhost ~]# for i in "$*" ; do echo $i ;done  #在有双引号情况,参数里引号内容当做一个参数输出
I am a good teacher
[root@localhost ~]# for i in "$@" ; do echo $i ;done  #在有双引号的情况,每个参数独立输出I am a
good
teacher
如果$* 和$@不带引号
[root@localhost ~]# for i in $* ; do echo $i ;done 
I 
am
a 
good
teacher
[root@localhost ~]# for i in $@ ; do echo $i ; done
I 
am
a 
good
teacher

$* 将所有的命令行所有参数视为单个字符串,等同于“$1$2$3”

$@ 将命令行每个参数视为单独的字符串,等同于“$1”“$2”“$3”,这是将参数传递给其他程序的最佳方式,因为它会保留所有内嵌在每个参数里的任何空白。

注意:上述区别仅在于加双引号的时候,即“$*”“$@”

2.进程变量

讲解最常用的进程变量$?

$? 获取执行的上一个指令的返回值


含义
0命令运行成功
2权限拒绝
1-125命令运行失败,特定的退出含义,是由各个单独的命令定义的
126命令找到了,但文件无法执行
127命令找不到
>128命令被系统强制结束
[root@localhost ~]# ll /dev/null 
crw-rw-rw- 1 root root 1, 3 Jun  9 17:37 /dev/null
[root@localhost ~]# echo $?
0
[root@localhost ~]# ll foo
ls: cannot access foo: No such file or directory
[root@localhost ~]# echo $?2