盘点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中最重要的输入命令!

相关推荐
慕容蕴秋1 分钟前
Perl语言的计算机网络
开发语言·后端·golang
慕容靖翾3 分钟前
Lua语言的无线通信
开发语言·后端·golang
哪吒编程6 分钟前
新项目终于用上了jdk24
java·后端
倚栏听风雨20 分钟前
Java中的Type详解
后端
梅一一26 分钟前
一个b站偷懒工具
javascript·后端
东方韡璟29 分钟前
Simula语言的正则表达式
开发语言·后端·golang
这里有鱼汤34 分钟前
面向Web开发者的Python速成指南,5分钟学会Python
后端·python
CHSnake40 分钟前
设计HTTP和gRPC错误码.md
后端·go
刀法如飞40 分钟前
DDD领域驱动设计详解-Java/Go/JS/Python实现
java·前端·后端
求知若饥41 分钟前
NestJS 项目实战-权限管理系统开发终章
后端·node.js·nestjs