本文档总结了编写shell脚本时推荐的代码规范。
1.#!/usr/bin/env bash
指定脚本使用的shell,比较灵活。
2.set -eux
当前shell的执行方式1
-e:脚本运行非0则退出
-u:有不存在的变量则报错
-x:调试脚本,详细的日志输出,免得去echo
3.set -o pipefail
当前shell的执行方式2
表示管道中任何一个命令失败都退出脚本
4.当前脚本包含外部脚本时(不会开启子shell进程):
(1). filename
(2)source filename,使shell读入指定的shell程序文件并依次执行文件中的所有语句
注:source 和 . 不开启子shell,在当前shell中执行,设定的局部变量在执行完命令后仍然有效。
注:bash 或 sh 或 shell script 执行时,起子shell,其继承父shell的环境变量,子shelll的变量和父shell没联系。
注:shell 的内件命令exec执行命令时,不启用子shell进程,用被执行的命令行替换掉当前的shell进程。
例如在当前shell中执行 exec pwd 表示用pwd替换当前shell进程 ,即为执行完后会退出当前shell。
可以将exec命令放到一个shell脚本中,用主脚本调用这个脚本,调用处用bash xx.sh(xx.sh为存放exec命令的脚本),这样会为xx.sh建立一个子shell去执行,当执行exec后该子脚本进程就被替换成相应的exec的命令。
5.查找并删除进程
ps -ef |grep 'mysql' |grep -v grep |awk '{print $2}' |xargs kill -9
6.[]里面如果有变量,给其使用双引号
[-f $filename]改为[-f "$filename"]
7.变量
(1)环境变量大写=>NAME
(2)自定义变量小写=>name
(3)特殊变量,通过命令行传递参数进行计算,$0代表脚本名字
(4)exec "$@" =>执行传进来的所有参数,此命令会替代子she进程。
(5)if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi =>$()和反引号用来引用命令,得到的是命令的执行结果