if条件判断

字符串判断
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真

数值判断
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=

双括号的作用:
在shell中,[ $a != 1 || $b = 2 ]是不允许出,要用[ $a != 1 ] || [ $b = 2 ],而双括号就可以解决这个问题的,[[ $a != 1 || $b = 2 ]]。并且不用担心变量为空的问题,可以省略双引号。

入参处理 有两种比较常用的方法,一是通过$1 $2 $3来按顺序引用,二是通过getops来引用,举例如下:

  1. # d后面的冒号表示可以带参数
  2. while getopts "hd:" arg
  3. do
  4. case $arg in
  5. h)
  6. usage
  7. exit 1
  8. ;;
  9. d)
  10. data_dir=$OPTARG
  11. ;;
  12. ?) #当有不认识的选项的时候arg为?
  13. echo "ERROR: unkonw argument,please try 'sh $0 -h'"
  14. exit -1
  15. ;;
  16. esac
  17. done

数组变量

  1. # 字符串按逗号隔开的场景,装换成空格分隔
  2. ip_list="10.21.1.2;10.21.1.3;10.21.1.4"
  3. # 然后用小括号括起来即为数组
  4. var_arr=($(echo $ip_list | tr ';' ' '))
  5. # 数组遍历,打印每个数组变量
  6. for var in ${var_arr[@]}
  7. do
  8. echo $var
  9. done

自动交互

有一些linux命令在执行过程中有交互,比如输入yes/no,密码等等,那么自动化的脚本需要能处理这些问题,可以使用expect命令来实现

  1. # 这是在bash环境里面来使用expect,需要用expect来包裹整个脚本段
  2. # 也可以在脚本开头直接申明是#!/bin/expect脚本环境,但是这样使用一些bash环境的命令,会有限制
  3. expect << EOF
  4. spawn ssh-keygen -t rsa
  5. expect {
  6. "*yes/no" {send "yes\n";exp_continue }
  7. "*id_rsa):" { send "\n"; exp_continue }
  8. "*passphrase):" { send "\n"; exp_continue }
  9. "*again:" { send "\n"; exp_continue }
  10. }
  11. EOF