盘点shell中对数以万计的IT人来说非常重要的特殊变量!

前言

shell中,除了常规的变量之外,也有一些特殊变量,这些变量,可以让我们熟练、方便的使用shell。而今天,我们就来学一学shell中一些好用的特殊变量。

特殊变量$n

首先来讲容易理解的特殊变量$n,特殊变量$n,表示脚本的第n个参数,因此,这个特殊变量可以读取脚本的参数。其中,脚本的第09个参数可以直接用$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

测试之后,如果是用bashsh执行的,就输出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的值。就像下面这样。

当然,你也可以"操控"$?的值,想"操控"$?的值,就要学到一个新命令------exitexit命令,用于返回一个值,值在0255之间,不填值时默认为0 ,相当于C/C++中的return关键字。这个命令,就可以"操控"$?的值。比如这条exit命令。

shell 复制代码
exit

这条exit命令,就是不填值的一种,当在shell脚本文件中执行时,此时用echo输出$?的值,就会输出0。如果把上面的exit命令换成exit 120,那么,执行后,用echo输出$?的值,就会输出120

除此之外,$?还可以看表达式是否成立 ,比如用[[ 3 > 5 ]]表达式进行测试,当这个表达式执行后,输出一下$?,就是11表示有异常,代表刚才测试的表达式不成立。

而用修正过来的表达式[[ 3 < 5 ]]进行测试后,输出一下$?,就是00代表没异常,代表这个表达式没问题。这就是特殊变量$?的作用。

特殊变量$$

最后一个特殊变量,就是特殊变量$$,表示脚本运行的当前进程ID号 ,那如何查询脚本当前运行进程的ID号?可以用ps -aux来查询,查询后,如果你不想查到大多数进程,那么就可以用grep bash来过滤你想查询的脚本当前运行进程的ID号。

现在,如果你想用简便方法查出脚本当前运行进程的ID号,只需要输出特殊变量$$的值,就行。

shell 复制代码
echo $$
sh $0

除此之外,不同的子shell也有不同的ID号,这点在执行上面的脚本中后可以看到,只是看起来就是舒服,实际没用。

到这里后,使用shell中的特殊变量对你来说都是雕虫小技了。

下篇预告

看似简单的read命令-->shell中最重要的输入命令!

相关推荐
00后程序员6 分钟前
从边缘场景出发:如何用多个调试工具系统性处理疑难杂症(含 WebDebugX 应用)
后端
魔镜魔镜_谁是世界上最漂亮的小仙女11 分钟前
java-注解&泛型
java·后端
苏三说技术20 分钟前
加了个索引,SQL性能竟然慢了10倍!
后端
子洋25 分钟前
从零搭建一个免费稳定的私有短链接服务
前端·javascript·后端
知其然亦知其所以然28 分钟前
【面试必问】Spring支持注入null和空字符串吗?不懂别去面试了!
java·后端·面试
VeSync技术29 分钟前
大数据dolphinscheduler的优化实践
大数据·后端
想用offer打牌30 分钟前
一站式了解本地缓存Guava(内含面试点)
后端·面试·架构
开挖掘机上班34 分钟前
Bash shell四则运算
linux·开发语言·bash·shell
JavaDog程序狗37 分钟前
【Java】集合遍历remove-add操作,这些坑你掉过几个
java·后端
懋学的前端攻城狮39 分钟前
深入浅出JVM-02自动内存管理机制全面剖析
java·jvm·后端