bash_coding_summary
最近的工作都与bash有关,且对我来说都很新鲜,因此写一篇总结。单纯的bash脚本也能组成一个较为庞大的工程,里面涉及到了一如环境变量、expect语法、子脚本方法引用等细节。
格式
bash脚本中使用#
表示注释,一般不会去读去符号后面的内容,但是与!
连用时除外。比如,在脚本第一行使用#!
来指明bash的位置。同其他编程语言一样,在bash中有顺序执行、判断以及循环等,默认时顺序执行,这里简要说明一下判断,循环等日后使用较多时补充。
if
在使用判断条件时使用,在编写时要注意格式:
- if 后面可以直接bash语句,如
yum -y install vim
,后接分号、then
,默认判断是能否成功执行,若成功则进入分支。 - 在进行值的判断时,用
[]
或[[]]
包裹起来,区别是后者能进行正则等更高级的解析判断。无论哪个,在使用时内部的符号都要与两边有至少一个空格。 - 在结尾时一定要有
fi
与开头的if
做匹配。
1 | if [[ $? -ne 0 ]]; then |
函数
主要涉及变量作用域、传参以及调用。函数样例如下:
1 | function print_cnt() { |
如上可以说是一个完整的bash脚本,子函数通过main方法来调用,并且传递了一个参数。
- 作用域:可以在方法内声明,带
local
前置的是在方法内有效;也可以在方法体外声明,在脚本内有效。 - 传参:可以传递多个,在接收时使用**
$
+数字指代;赋值时要注意格式,等号两边不能有空格**。 - 调用:如main方法内,函数名后用空格隔开,直接写上待传的参数。
expect、spawn
在处理自动化任务时会用到这两个(使用前需要安装相关依赖)。如:
1 | expect <<-EOF |
里面的EOF
是约定俗成的词,可以替换成其他的,前面的短横线表示结尾处的EOF
前可以使用若干个制表符格式化。
awk、sed
这两个命令都是用来处理更高级的需求的,比如:
1 | jps -l | awk '{print $1}' |