在shell编程中,我们经常会传入一些参数,例如main.sh 1 2 3
,我们想获取后面的1
、2
、3
这就会用到shell
的特殊参数了,我们来看看shell
的特殊变量含义。
我们从如下几个方面讲解shell
特殊参数
- 举个简单的例子
- 特殊参数讲解
- 我们做一个简单的
shell
日志库
举个调用参数的例子
脚本代码
执行脚本
特殊参数讲解
变量 | 含义 |
$0 | 返回脚本本身 |
1、1、1、2、$3 ... | 返回脚本后跟第1个、第2个、第3个参数 |
$# | 返回参数数量 |
$* | 返回所有参数 |
$@ | 返回所有参数 |
$? | 获取前一个命令/脚本退出状态 |
返回脚本本身
若在脚本中使用 $0
则返回 脚本名称
若直接在命令行中使用的时候,则返回bash
命令本身
例如:
执行脚本
若直接调用$0
则返回 shell
本身
例如
获取跟随的参数
我们可以使用$1
、$2
、$3
... 来获取脚本跟随的参数
我们还是看个例子
我们执行脚本,后面跟4个参数:a b c d
由于我们只输出了前3个,所以我们输出了 a``b``c
由此,我们可以总结下,该特殊变量的意义
获取参数个数
可以使用$#
来获取参数个数,例如
我们修改下example3.sh
脚本,新增一个获取个数语句
我们执行脚本,并给参数a
、b
、c
、d
、e
返回命令/函数退出码
我们可以使用 $?
来获取退出码,其中退出码范围含义为
退出状态码: 0——255
注意哦,这里退出码,应该为非负数
退出码
退出码 | 含义 |
0 | 执行成功 |
2 | 命令使用不正确、选项无效/缺少参数 |
126 | 命令不可执行 |
127 | 未找到命令 |
128+ | 发生致命错误 |
只需要记住,在shell
中,退出码为0
,代表成功,否则为失败
我们看看例子
命令返回成功
命令不可执行,返回状态码(126)
未找到命令,返回状态码(127)
发生致命错误,返回(128+)
哪能干嘛呢?
还记得我们之前写的脚本,是如何判断命令执行成功的把,
例如,我们要判断压缩命令执行了么,我们可以这样写
tar zcvf back.tar.gz back if [ 0 -eq $? ];then echo "压缩成功" ... fi echo "压缩失败" exit 1
获取全部参数
我们可以使用 $*
或者 $@
来获取全部参数,我们尝试下
脚本
我们执行脚本
我们发现都可以获取全部参数,那么二者到底有什么区别呢?
$*
相当于$1$2$3...
$@
相等于"$1"``"$2"``"$3"
等
它两的分隔符,是有变量IFS
来决定的,默认情况下IFS
为空格,但是在"$@"
下,若有空格被包含在双引号中,则相当于一个变量
我们看一个例子
我们将$@
,使用双引号包起来
你们猜猜结果,我们执行看下实际结果
可以看到,在"$@"
下 ,我们将双引号""
包含的字符,试做一个变量,那么它的参数算几个呢? 算5
个哈
综合shell特殊参数例子,打造做一个shell log库
定义logs.sh
脚本
脚本详解
根据不同的日志类型,来打印日志,日志输出包含 [日志类型] 日期 时间 文件:行号 日志内容
我们通常使用 内置变量 LINENO
和 BASH_LINENO
来打印行号
shift
为偏移量,这里偏移的是我们传入的参数
我们编写main.sh
脚本测试调用logs
函数
执行脚本
我们可以看到,脚本执行的很成功,行号也完全正确
总结
还记得在redhat 6
版本时,那时候还没有接入system
管理进程,那个时候,我们一般使用/etc/init.d/
下的管理工具,现在debian
系列还保留有部分这种样式,那个时候我们启动/停止进程也不就是这样的么,
例如:
/etc/init.d/redis-server status
我们可以使用file
看一下这个文件类型,会发现它的类型为shell script
我们看下
我们看下文件类型
所以说,shell
特殊变量,还是使用很多的,我们甚至于可以打开看一下具体逻辑,甚至于修改它
总的来说,shell
特殊变量只有这几个,只要我们组合的好,我们也能做出大事情来,还有一个要点,就是特殊变量这些参数只能被引用,可以理解为shell
的“关键字”,不允许他们自定义。
虽然现在python
和go
大行其道,但是运维使用最多的应该便是shell
了,它像胶水一样,可以将python
和go
执行结果直接拿到shell
中使用,这样才能成为运维的左膀右臂。