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来引用,举例如下:
# d后面的冒号表示可以带参数
while getopts "hd:" arg
do
case $arg in
h)
usage
exit 1
;;
d)
data_dir=$OPTARG
;;
?) #当有不认识的选项的时候arg为?
echo "ERROR: unkonw argument,please try 'sh $0 -h'"
exit -1
;;
esac
done
数组变量
# 字符串按逗号隔开的场景,装换成空格分隔
ip_list="10.21.1.2;10.21.1.3;10.21.1.4"
# 然后用小括号括起来即为数组
var_arr=($(echo $ip_list | tr ';' ' '))
# 数组遍历,打印每个数组变量
for var in ${var_arr[@]}
do
echo $var
done
自动交互
有一些linux命令在执行过程中有交互,比如输入yes/no,密码等等,那么自动化的脚本需要能处理这些问题,可以使用expect命令来实现
# 这是在bash环境里面来使用expect,需要用expect来包裹整个脚本段
# 也可以在脚本开头直接申明是#!/bin/expect脚本环境,但是这样使用一些bash环境的命令,会有限制
expect << EOF
spawn ssh-keygen -t rsa
expect {
"*yes/no" {send "yes\n";exp_continue }
"*id_rsa):" { send "\n"; exp_continue }
"*passphrase):" { send "\n"; exp_continue }
"*again:" { send "\n"; exp_continue }
}
EOF