shell 特殊参数

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: shell 特殊参数

在shell编程中,我们经常会传入一些参数,例如main.sh 1 2 3 ,我们想获取后面的123 这就会用到shell的特殊参数了,我们来看看shell的特殊变量含义。

我们从如下几个方面讲解shell特殊参数

  • 举个简单的例子
  • 特殊参数讲解
  • 我们做一个简单的shell日志库




举个调用参数的例子

脚本代码

image.png


执行脚本

image.png


特殊参数讲解

变量 含义
$0 返回脚本本身
1、1、12、$3 ... 返回脚本后跟第1个、第2个、第3个参数
$# 返回参数数量
$* 返回所有参数
$@ 返回所有参数
$? 获取前一个命令/脚本退出状态



返回脚本本身


若在脚本中使用 $0 则返回 脚本名称

若直接在命令行中使用的时候,则返回bash命令本身

例如:

image.png


执行脚本

image.png


若直接调用$0则返回 shell 本身

例如

image.png


获取跟随的参数

我们可以使用$1$2$3... 来获取脚本跟随的参数

我们还是看个例子

image.png

我们执行脚本,后面跟4个参数:a b c d

image.png

由于我们只输出了前3个,所以我们输出了 a``b``c

由此,我们可以总结下,该特殊变量的意义

image.png

获取参数个数

可以使用$#来获取参数个数,例如

我们修改下example3.sh脚本,新增一个获取个数语句

image.png

我们执行脚本,并给参数abcde

image.png


返回命令/函数退出码

我们可以使用 $?来获取退出码,其中退出码范围含义为

退出状态码: 0——255

注意哦,这里退出码,应该为非负数


退出码

退出码 含义
0 执行成功
2 命令使用不正确、选项无效/缺少参数
126 命令不可执行
127 未找到命令
128+ 发生致命错误

只需要记住,在shell中,退出码为0,代表成功,否则为失败


我们看看例子

命令返回成功

image.png


命令不可执行,返回状态码(126)

image.png


未找到命令,返回状态码(127)


image.png


发生致命错误,返回(128+)

image.png


哪能干嘛呢?

还记得我们之前写的脚本,是如何判断命令执行成功的把,

例如,我们要判断压缩命令执行了么,我们可以这样写

tar zcvf back.tar.gz back
if [ 0 -eq $? ];then
  echo "压缩成功"
  ...
fi
echo "压缩失败"
exit 1




获取全部参数


我们可以使用 $* 或者 $@来获取全部参数,我们尝试下

脚本

image.png


我们执行脚本

image.png


我们发现都可以获取全部参数,那么二者到底有什么区别呢?


  • $*相当于 $1$2$3...
  • $@相等于"$1"``"$2"``"$3"

它两的分隔符,是有变量IFS来决定的,默认情况下IFS为空格,但是在"$@"下,若有空格被包含在双引号中,则相当于一个变量

我们看一个例子

我们将$@,使用双引号包起来

image.png


你们猜猜结果,我们执行看下实际结果

image.png

可以看到,在"$@"下 ,我们将双引号""包含的字符,试做一个变量,那么它的参数算几个呢? 算5个哈



综合shell特殊参数例子,打造做一个shell log库

定义logs.sh脚本


image.png

image.png


脚本详解

根据不同的日志类型,来打印日志,日志输出包含 [日志类型] 日期 时间 文件:行号 日志内容

我们通常使用 内置变量 LINENOBASH_LINENO来打印行号

shift为偏移量,这里偏移的是我们传入的参数

我们编写main.sh脚本测试调用logs函数

image.png


执行脚本

image.png

我们可以看到,脚本执行的很成功,行号也完全正确



总结


还记得在redhat 6版本时,那时候还没有接入system管理进程,那个时候,我们一般使用/etc/init.d/下的管理工具,现在debian系列还保留有部分这种样式,那个时候我们启动/停止进程也不就是这样的么,


例如:

/etc/init.d/redis-server status

我们可以使用file看一下这个文件类型,会发现它的类型为shell script

我们看下

image.png


我们看下文件类型

image.png

所以说,shell特殊变量,还是使用很多的,我们甚至于可以打开看一下具体逻辑,甚至于修改它

总的来说,shell特殊变量只有这几个,只要我们组合的好,我们也能做出大事情来,还有一个要点,就是特殊变量这些参数只能被引用,可以理解为shell的“关键字”,不允许他们自定义。


虽然现在pythongo大行其道,但是运维使用最多的应该便是shell了,它像胶水一样,可以将pythongo执行结果直接拿到shell中使用,这样才能成为运维的左膀右臂。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7月前
|
存储 缓存 Linux
【Shell 命令集合 磁盘维护 】Linux 设置和查看硬盘驱动器参数 hdparm命令使用教程
【Shell 命令集合 磁盘维护 】Linux 设置和查看硬盘驱动器参数 hdparm命令使用教程
155 0
|
机器学习/深度学习 Shell
Shell 传递参数
Shell 传递参数
73 0
|
SQL 分布式计算 Hadoop
55 Hive Shell参数
55 Hive Shell参数
56 0
|
4月前
|
Shell
[shell]在curl测试的data参数中引用变量
[shell]在curl测试的data参数中引用变量
240 1
|
7月前
|
存储 弹性计算 运维
调整虚拟机内存参数的 shell 脚本
【4月更文挑战第29天】
80 2
|
7月前
|
存储 弹性计算 运维
调整虚拟机内存参数的shell 脚本
【4月更文挑战第29天】
68 0
|
7月前
|
编解码 Linux Shell
【Shell 命令集合 系统设置 】Linux 设置Linux系统的控制台参数和属性setconsole命令 使用指南
【Shell 命令集合 系统设置 】Linux 设置Linux系统的控制台参数和属性setconsole命令 使用指南
110 0
|
7月前
|
存储 Shell Linux
【Shell 命令集合 系统设置 】Linux 将参数作为命令行输入 eval命令 使用指南
【Shell 命令集合 系统设置 】Linux 将参数作为命令行输入 eval命令 使用指南
107 0
|
7月前
|
存储 Shell
Shell变量和参数
Shell变量和参数
38 3
|
7月前
|
Shell
shell变量和参数
shell变量和参数
58 1