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

相关推荐
HelloZheQ44 分钟前
Go:简洁高效,构建现代应用的利器
开发语言·后端·golang
caihuayuan51 小时前
[数据库之十四] 数据库索引之位图索引
java·大数据·spring boot·后端·课程设计
风象南2 小时前
Redis中6种缓存更新策略
redis·后端
程序员Bears2 小时前
Django进阶:用户认证、REST API与Celery异步任务全解析
后端·python·django
非晓为骁3 小时前
【Go】优化文件下载处理:从多级复制到零拷贝流式处理
开发语言·后端·性能优化·golang·零拷贝
北极象3 小时前
Golang中集合相关的库
开发语言·后端·golang
喵手3 小时前
Spring Boot 中的事务管理是如何工作的?
数据库·spring boot·后端
玄武后端技术栈5 小时前
什么是延迟队列?RabbitMQ 如何实现延迟队列?
分布式·后端·rabbitmq
液态不合群6 小时前
rust程序静态编译的两种方法总结
开发语言·后端·rust
bingbingyihao6 小时前
SpringBoot教程(vuepress版)
java·spring boot·后端