bash_coding_summary
Sebastian Lv4

最近的工作都与bash有关,且对我来说都很新鲜,因此写一篇总结。单纯的bash脚本也能组成一个较为庞大的工程,里面涉及到了一如环境变量、expect语法、子脚本方法引用等细节。

格式

bash脚本中使用#表示注释,一般不会去读去符号后面的内容,但是与!连用时除外。比如,在脚本第一行使用#!来指明bash的位置。同其他编程语言一样,在bash中有顺序执行、判断以及循环等,默认时顺序执行,这里简要说明一下判断,循环等日后使用较多时补充。

if

在使用判断条件时使用,在编写时要注意格式:

  • if 后面可以直接bash语句,如yum -y install vim,后接分号、then,默认判断是能否成功执行,若成功则进入分支。
  • 在进行值的判断时,用[][[]]包裹起来,区别是后者能进行正则等更高级的解析判断。无论哪个,在使用时内部的符号都要与两边有至少一个空格。
  • 在结尾时一定要有fi与开头的if做匹配。
1
2
3
if [[ $? -ne 0 ]]; then
echo "success"
fi

函数

主要涉及变量作用域传参以及调用。函数样例如下:

1
2
3
4
5
6
7
8
9
10
11
12
function print_cnt() {
local cnt=$1
echo "I got $cnt apples"
}

function main(){
echo '====start'
print_cnt 6
echo '====end'
}

main

如上可以说是一个完整的bash脚本,子函数通过main方法来调用,并且传递了一个参数。

  • 作用域:可以在方法内声明,带local前置的是在方法内有效;也可以在方法体外声明,在脚本内有效。
  • 传参:可以传递多个,在接收时使用**$+数字指代;赋值时要注意格式,等号两边不能有空格**。
  • 调用:如main方法内,函数名后用空格隔开,直接写上待传的参数。

expect、spawn

在处理自动化任务时会用到这两个(使用前需要安装相关依赖)。如:

1
2
3
4
5
expect <<-EOF
spawnd ssh root@192.168.1.1
expect "*password*"
send $passwd
EOF

里面的EOF是约定俗成的词,可以替换成其他的,前面的短横线表示结尾处的EOF前可以使用若干个制表符格式化。

awk、sed

这两个命令都是用来处理更高级的需求的,比如:

1
2
3
4
5
6
7
8
9
jps -l | awk '{print $1}'
````
只打印进程ID,或者其他字段,就可以通过awk和管道与其他命令组合起来使用。
而sed可以更方便地处理字符串,比如替换。

### {}、()
这里区分花括号和圆阔号,前者可以用在变量的引用,比如声明变量后使用`$`,为了更方便地与其他字符区分,还可以加上花括号,比如`${ip}`。而美元符与圆括号的组合能让我们方便地使用一个命令的输出内容。
```bash
kill -9 $(jps -l | grep 'pinyin' | awk '{print $1}')