一、Bash自动化脚本基础

在编写bash脚本时,需要注意一下几个点:

变量

  1. 变量的定义: 在定义变量时,建议用大写来表示,因为小写可能会和Linux命令冲突;其次是定义是等号两边不能有空格。
  2. 变量的引用: 在引用变量时,变量名要放在”${}”内,且要加上英文双引号,尤其是在执行系统命令是引用变量,最好加上双引号,这样可以防止变量有空格或者特殊字符。
  3. $var,${var},”${var}”三者的区别:$var和${var}类似,区别在于是否需要明确变量边界,且${var}的用法比$var更加丰富; “${var}”当变量值包含空格、特殊字符或不确定是否包含时(比如用户输入、文件路径等),可以保留变量中的特殊字符,比如通配符。

if条件判断

  1. 基本格式: if [[ -属性 “${变量}” ]]; then fi / if [[ “${变量}” -属性 “${变量}”]]; then elif fi.
  2. 两个中括号的作用是,在判断是可以在里面做复杂判断,如正则,逻辑与,逻辑或等判断
  3. 内层中括号和属性变量要有空格隔开
    photo

for循环

  1. 基本格式: for 参数 in “${变量}” ; do done
  2. 需要注意的是,for循环里面调用参数可以不用向之前那样麻烦,只需要$参数就可以了
    photo

while循环

  1. 基本格式: while [$变量 -属性 值]; do done.
  2. 在while循环中,要避免陷入死循环,一定要添加推出循环的条件
    photo

函数

  1. 基本格式: fun_name(){…}.
  2. 函数变量的定义: var_name=$1,var_name2=$2 …,变量的定义一定要从$1开始,五个变量就是$1到$5
  3. 函数的调用,可以在sh文件内部直接给变量赋值,也可以在外部调用时动态赋值,需注意的是,在外部赋值时需要让系统先解析到函数,在调用才可以,例: 第一步: source fun.sh, 第二步: fun_name “aaaa” “aaaa”

脚本中的比对符号

eq == ,ne != ,gt >, lt < ,ge >=, le <=

二、空格问题需注意

  1. $(date’+%Y-%m-%d %H:%M:%S’), 在这段脚本代码中,如果执行,会报错,因为date与单引号之间没有空格
  2. !systemctl start nginx, 这段也会报错,因为感叹号和命令之间没有空格
  3. find / -name “*.txt” -exec rm -f{}\; 这段代码内rm -f命令与大括号之间要有空格,大括号和反斜杠也要有空格,否则执行不成功

一定要注意,运算符或者其他符号和命令之间的空格!!!

三、标准Bash模块

变量含义实例输出常见用途
$0当前脚本的文件名./deploy.sh获取脚本名(用于日志或提示)
$1~$9第1~9个位置参数(变量),第10个开始就是${10},以此类推$1 -> nginx获取命令行传入的参数
$#获取传入参数的个数3判断参数数量是否正确
$*所有参数作为一个整体字符串"a b c"以单字符串形式获取所有参数
$@所有参数分别展开"a" "b" "c"遍历参数
$?获取上一条命令的退出状态码/执行码0/1判断命令是否执行成功
$$当前shell进程的pid14532用于生成临时文件名
$!最后一个进程pid6721监控后台任务
$-当前shell启动是的选项标志himBH调试或环境检查
$_上一条命令的最后一个参数file.txt快捷引用
$PWD获取当前工作目录/root/bashs/显示当前目录
$OLDPWD上一个目录/root/返回上一次目录(cd -)
$HOME当前家目录/home/lcj用户相关操作
$USER当前登录用户名root日志、权限检查
$HOSTNAME主机名lcj日志、系统信息输出
$RANDOM生成随机数(0~32767)347生成随机字符串,文件名
$LINENO当前脚本执行的行号20调试脚本时查看位置
$SECONDS脚本运行秒数120统计执行耗时
$FUNCNAME当前函数名称main在函数内输出自身名字
$BASH_SOURCE当前脚本文件路径/root/bashs/区分被source的脚本
$BASH_VERSIONbash版本号5.2.15(1)-release检查兼容性
$PATH系统可执行路径/usr/local/bin:/usr/bin环境变量配置
$PS1交互式提示符变量[\u@\h \W]\$定义命令行提示符
IFS字符分隔符空格、制表符、换行符控制字符串分割行为