大二的时候学了shell脚本编程,这在后来的Linux系统的使用中给了我很大的帮助,它能让我更加快捷的完成一些工作。这也是一个对shell编程细节部分的复习系列,参考到了《Linux命令行与shell脚本编程大全 第3版》,当年我用到的还是第2版,时间过得真快呀。
先查看一下默认使用的shell版本:
$ echo $SHELL
/bin/bash
$ bash --version
GNU bash,版本 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证第三版或者更新版本 <http://gnu.org/licenses/gpl.html>
本软件是自由软件,您可以自由地更改和重新发布。
在法律许可的情况下特此明示,本软件不提供任何担保。
一,一个简单的脚本是怎样运行起来的
1,创建一个空文件:
2,编写脚本内容:
- 第二行以#开头,表示是一个注释,不会被执行。
- 第一行#后面的惊叹号告诉shell用哪个shell来运行脚本。
3,修改文件权限:
- 必须拥有权限才能运行。
4,在当前目录运行脚本:
- 在脚本所在目录运行脚本用./脚本名。
- 在所有目录都能运行脚本,需将脚本所在目录加入PATH变量。
通过这么一个简单的脚本,我们就能获得执行多条shell命令才能获得的效果,而且定制化程度还很高,它让我们能快速地执行一系列操作和获得所需的内容,这就是shell脚本的优势。
二,构建脚本
1,添加自己的文本消息来告诉脚本用户脚本正在做什么,通过echo命令来实现
1,echo语句添加到shell脚本中任何需要显示额外信息的地方:
2,使用-n将文本与命令输出显示在同一行中:
2,使用变量
1,使用环境变量:
- 变量名称之前加上美元符( $)来使用这个变量。
- echo命令中的环境变量会在脚本运行时替换成当前值。
- 使用美元符号,要用 \ 转义。
2,使用用户变量:
3,从命令输出中提取信息,并将其赋给变量:
- 法一:testing=‘date’
- 法二:testing=$(date)
today变量是被赋予格式化后的date命令的输出。这是提取日期信息来生成日志文件名常用的一种技术。+%y%m%d格式告诉date命令将日期显示为两位数的年月日的组合。
3,重定向输入和输出
可以将命令的输出重定向到另一个位置(比如文件)。重定向可以用于输入,也可以用于输出,可以将文件重定向到命令输入。
1,输出重定向:command > outputfile
- 追加重定向 command >> outputfile
2,输入重定向:command < inputfile
- wc命令可以对对数据中的文本进行计数:文本的行数、文本的词数、文本的字节数。
4,管道
将一个命令的输出作为另一个命令的输入的过程,叫管道连接(piping):command1 | command2。
可以在一条命令中使用任意多条管道。可以持续地将命令的输出通过管道传给其他命令来细化操作:
也可以搭配使用重定向和管道来将输出保存到文件中。
5,执行数学运算
执行数学运算的能力对任何编程语言都很重要的,但在shell中就必见不方便,需要两种命令的辅助。
1,expr命令:
ARG1 | ARG2 如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2
ARG1 & ARG2 如果没有参数是null或零值,返回ARG1;否则返回0
ARG1 < ARG2 如果ARG1小于ARG2,返回1;否则返回0
ARG1 <= ARG2 如果ARG1小于或等于ARG2,返回1;否则返回0
ARG1 = ARG2 如果ARG1等于ARG2,返回1;否则返回0
ARG1 != ARG2 如果ARG1不等于ARG2,返回1;否则返回0
ARG1 >= ARG2 如果ARG1大于或等于ARG2,返回1;否则返回0
ARG1 > ARG2 如果ARG1大于ARG2,返回1;否则返回0
ARG1 + ARG2 返回ARG1和ARG2的算术运算和
ARG1 – ARG2 返回ARG1和ARG2的算术运算差
ARG1 * ARG2 返回ARG1和ARG2的算术乘积
ARG1 / ARG2 返回ARG1被ARG2除的算术商
ARG1 % ARG2 返回ARG1被ARG2除的算术余数
STRING : REGEXP 如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
match STRING REGEXP 如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
substr STRING POS LENGTH 返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串
index STRING CHARS 返回在STRING中找到CHARS字符串的位置;否则,返回0
length STRING 返回字符串STRING的数值长度
- TOKEN 将TOKEN解释成字符串,即使是个关键字
(EXPRESSION) 返回EXPRESSION的值
2,使用方括号
方括号比expr命令更加优雅:在将一个数学运算结果赋给某个变量时,可以用美元符和方括号( $[ operation ])将数学表达式围起来:
但还是有个大问题:bash shell数学运算符只支持整数运算。若要进行任何实际的数学计算,这是一个巨大的限制。
3,浮点运算
最常见的方案是用内建的bash计算器,叫作bc:variable=$(echo “options; expression” | bc)
在一个命令行中列出多个表达式进行大量运算,就会有点麻烦,但可以:
6,完美地退出脚本
shell中运行的每个命令都使用退出状态码( exit status)告诉shell它已经运行完毕。
对shell脚本而言,运行完最后一条命令时,脚本就结束了。同样地,在命令结束运行时一个状态码由命令传给shell,可以捕获这个值并在脚本中使用,让脚本的退出更加优雅。
$?变量能让我们查看退出状态码:
- 0 命令成功结束
- 1 一般性未知错误
- 2 不适合的shell命令
- 126 命令不可执行
- 127 没找到命令
- 128 无效的退出参数
- 128+x 与Linux信号x相关的严重错误
- 130 通过Ctrl+C终止的命令
- 255 正常范围之外的退出状态码
至此,可以定制你自己的shell脚本了,特别是一些信息的组合输出与记录型的操作,都可以由你的脚本来完成啦,想要向脚本内添加更多的执行逻辑,可以看下一篇。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/98160.html