前言
在shell
中,除了常规的变量之外,也有一些特殊变量,这些变量,可以让我们熟练、方便的使用shell
。而今天,我们就来学一学shell
中一些好用的特殊变量。
特殊变量$n
首先来讲容易理解的特殊变量$n
,特殊变量$n
,表示脚本的第n
个参数,因此,这个特殊变量可以读取脚本的参数。其中,脚本的第0
到9
个参数可以直接用$n
表示,而脚本的第10
个及以上参数就需要用${n}
表示,为什么呢?以下面的脚本举例。
在这个脚本中,第一行echo
虽然从表面上看输出的是$10
,但是从颜色上来看,$1
是紫色,0
是红色,说明$1
是一个部分,0
又是一个部分 ,因此第一行echo
实际上是输出这个脚本的第1
个参数和0
拼接在一起的结果。
而在第二行echo
中,由于$
后面用大括号括起来了10
,让$10
成为了一个整体,因此第二行echo
才是真正输出这个脚本的第10
个参数。
之后,我们测试这个脚本,让这个脚本的第1
个参数为2
,第10
个参数为10
,结果就是这样:
这也就说明了为什么脚本的第10
个及以上参数就需要用${n}
表示的原因。
关于$n
这个特殊变量,其实还有重要的一点,就是$0
,$0
,表示脚本的第0
个参数,脚本的的第0
个参数是什么呢?我们可以测试一下在test.sh
中的这条脚本。
shell
echo $0
测试之后,如果是用bash
或sh
执行的,就输出test.sh
;而如果是用./test.sh
执行的,并且是在文件可以执行的情况下,那么就输出./test.sh
,说明$0
表示执行脚本文件的名字,因此,也就可以实现递归的效果。
讲到这里后,特殊变量$n
就讲完了。
特殊变量$#
然后讲特殊变量$#
,特殊变量$#
,表示脚本参数的数量。这里简单举例一下这段脚本。
shell
echo $#
如果这段脚本执行时参数有1
个,那么就输出1
;如果这段脚本执行时参数有3
个,那么就输出3
;再如果这段脚本执行时没有参数,那么就输出0
。十分的简单。
特殊变量$*
和$@
接着讲特殊变量$*
和$@
,特殊变量$*
和$@
,都表示脚本的全部参数,参数之间用空格分隔。
但$*
如果放在for
循环中,并且加了双引号,则在一次for
循环中直接获取脚本的全部参数数量,而如果$@
放在for
循环中,并加上了双引号,则在每一次for
循环中从左到右获取脚本的一个参数。之后为这两个特殊变量再举第n个例子。
shell
echo $*
echo $@
如果这个脚本在执行时的参数从左到右依次为:1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =,那么,这个脚本是这样打印的。
而这两个特殊变量如果放在for
循环中并且加了双引号,并且脚本的参数跟之前一样,那么就是另一种打印方式。
讲好这两个特殊变量$*
和$@
后,就还有两个特殊变量没有讲完了。
特殊变量$?
再接着讲特殊变量$?
,特殊变量$?
,指上一个脚本的返回值,而特殊变量$?
,也可以看脚本是否执行正常,一般0
表示没问题,非0
的数就有问题 ,跟C/C++
中main
函数中的return
关键字返回的值的意思特别相近。
举个例子,如果你用cd /
转到了系统的根目录,那么,此时你用echo
输出一下$?
的值,就会输出一个0
。而如果你随便乱输,那么就会报错,此时你再用echo
输出一下$?
的值,就会输出一个非0
的值。就像下面这样。
当然,你也可以"操控"$?
的值,想"操控"$?
的值,就要学到一个新命令------exit
,exit
命令,用于返回一个值,值在0
到255
之间,不填值时默认为0
,相当于C/C++
中的return
关键字。这个命令,就可以"操控"$?
的值。比如这条exit
命令。
shell
exit
这条exit
命令,就是不填值的一种,当在shell
脚本文件中执行时,此时用echo
输出$?
的值,就会输出0
。如果把上面的exit
命令换成exit 120
,那么,执行后,用echo
输出$?
的值,就会输出120
。
除此之外,$?
还可以看表达式是否成立 ,比如用[[ 3 > 5 ]]
表达式进行测试,当这个表达式执行后,输出一下$?
,就是1
,1
表示有异常,代表刚才测试的表达式不成立。
而用修正过来的表达式[[ 3 < 5 ]]
进行测试后,输出一下$?
,就是0
,0
代表没异常,代表这个表达式没问题。这就是特殊变量$?
的作用。
特殊变量$$
最后一个特殊变量,就是特殊变量$$
,表示脚本运行的当前进程ID号 ,那如何查询脚本当前运行进程的ID号?可以用ps -aux
来查询,查询后,如果你不想查到大多数进程,那么就可以用grep bash
来过滤你想查询的脚本当前运行进程的ID号。
现在,如果你想用简便方法查出脚本当前运行进程的ID号,只需要输出特殊变量$$
的值,就行。
shell
echo $$
sh $0
除此之外,不同的子shell
也有不同的ID号,这点在执行上面的脚本中后可以看到,只是看起来就是舒服,实际没用。
到这里后,使用shell
中的特殊变量对你来说都是雕虫小技了。
下篇预告
看似简单的read命令-->shell中最重要的输入命令!