关于linux的shell编程,由于网上缺乏系统的学习资料,部分教程也不够全面,有些博客只介绍了部分shell命令。根据我个人编写shell脚本的经验,对shell编程做个总结,带领大家深入地认识一些shell编程。
首先,看一下这个:
上面这段shell代码摘自我很久之前写过的一个项目,不过也是因为该脚本的需求简单,所以只是单纯的几条命令。在我看来,简单命令的堆积还算不上是真正的shell编程。真正的shell编程在我看来,应该是:本需要通过重量级的语言编写的程序,可以通过shell脚本快速的构建出来。且内部存在一些稍微复杂的流程逻辑,判断逻辑等。不过我的主张还是:使问题简单化,哪种解决方案简单用哪种。对于有些善于利用命令行工具的人,或者所谓的系统管理员,还是比较适合使用shell脚本来解决问题的!
shell编程核心内容:
基础级别(★)
1. 必不可少的命令行工具,busybox工具包,系统buildin命令,binutil工具包等,不求全都会用,但至少对几个使用频率高的命令要十分清楚。
2. 曾经的王者工具,awk,sed这两个处理文本的命令要会使用,awk对于数据的格式化很有帮助,sed用来替换各种形式的文本内容。
shell编程核心(★★★)
3. 各种条件判断,最主要的是字符串的判断,因为命令输出一般都是字符串,所以拿到命令的字符串再做各种判断很重要,频率也很高。判断的原始命令是test,但是一般都用[ ]中括号简写。除了字符串,必要的时候还有数字的判断,文件或路径的判断等。这些在菜鸟教程上都有很详细的说明,必要时做参考。甩个链接:https://www.runoob.com/linux/linux-shell-test.html
4. 流程控制块,if...then...else...fi,for do ... done,while do ... done,case ... in );;esac等,break/continue跟高级语言一样使用。以上用的最多,其他until之类的可以作为辅助使用。
5. 字符串的截取等,如${str:-2}之类,一般要清楚以下几个操作:截取子串(下标截取,倒序截取),正则匹配(搜索子串,替换子串)。一般使用[ ], expr命令,不懂的可以了解一下命令各自的功能。
6. shell参数提取,包括脚本参数的提取,内部函数模块的参数提取。使用:
$0脚本或函数模块的名称,另外,可以使用basename $0取出$0里面的路径。
$1,$2 ... 代表各个参数。
$@不加双引号的所有参数。
$*加双引号的所有参数。
$?上条命令的执行结果0成功其他数字表示失败。
7. 使用getopt,set,eval,shift等命令来辅助解析命令行参数。命令行参数,其对于脚本或命令的重要性是不言而喻的。getopt用于解析并格式化参数字符串,set将参数提取到$1,$2,$3...,eval解决参数中的空格和双引号问题,shift用于吞噬掉最前面(左)的参数,将后面的参数前移,方便你一步步提取参数。一般使用一个while循环段解析各个命令行参数。写个实例供大家了解下,因为这几个命令的解释还挺复杂的,可以使用man了解下或者网上搜索下:
总之,就是把用户传入的一堆参数,提取到自己设置的变量里面,方便下面通过变量访问。
先介绍这么多,今天有点头晕,主要是想跟大家分享一下shell编程的精髓,后续在修改一下这篇文章。