条件测试
test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
格式1: test 条件表达式 格式2: [ 条件表达式 ]
文件测试
[ 操作符 文件或者目录 ] [ -e 1.txt ]#查看1.txt是否存在,存在返回0 echo $? #查看是上一步命令执行结果 0成功 非0失败 -d 测试是否为目录(Directory) -e 测试目录或文件是否存在(Exist) -f 测试是否为文件(File) -r 测试当前用户是否有权限读取 (Read) -w 测试当前用户是否有权限写入 (Write) -x 测试当前用户是否有权限执行 (eXcute)
整数值比较
[ 整数1 操作符 整数2 ] (( 100 != 99 )) 常用的测试操作符(重点) 英文命令(只能操作整数) 操作符(可以比较英文命令不能比较的整数) -eq 等于(Equal) == -ne 不等于(Not Equal) != -gt 大于(Greater Than) > -lt 小于 (Lesser Than) < -le 小于或等于(Lesser or Equal) <= -ge 大于或等于(Greater or Equal) >=
逻辑符号
#格式1: [ 表达式1 ] || [ 表达式2 ] [ 表达式1 -o 表达式2 ] 注意不同写法括号数不一样 [[ 表达式1 || 表达式2 ]] #格式2: 命令1 操作符 命令2 -a或&&:逻辑与,”而且“的意思 -o或||:逻辑或,”或者“的意思 !:逻辑否
[ -d /var/www ] || mkdir -p /var/www #使用逻辑或的特殊属性进行目录创建操作(或的第一个条件满足就不会判断第二个) #判断目录是否存在,不存在创建
三元运算符
表达式 ? 值A : 值B 表达式 && 命令A || 命令B #相当于if else #满足执行A 不满足执行B
if语句
单分支
if 条件测试操作 if 已用空间>80% then 命令序列 > then 报警 fi fi
if 语句 if [ 表达式 ] if test 表达式 #写法1 if 命令 then 代码块 fi #写法2 if [ 表达式 ];then 代码块1; 代码块2; fi
双分支
if 条件 then 满足执行命令 else 不满足执行 fi
多分支
依次判断,满足一个条件语句执行后直接结束,不再判断执行之后的语句
if 条件1 then 执行命令1 elif 条件2 then 执行命令2 else 不成立执行 fi
case语句
与if elif相比,case不用依次判断,而是同时判断若干条件,更加高效
case $变量 in 模式1) 代码1 ;; 模式2) #此处的模式表达式要么为字符串要么为通配符 #100) 9[0-9]) #字符串匹配 #[ $num -ge 90 -a $num -lt 100] && a='A') #通配符匹配 代码2 ;; *) #都不满足条件 代码3 esac
case $score in 100) echo 'nice' ;; 9[0-9]) #90-99 #字符串写法 #[ $num -ge 90 -a $num -lt 100] && a='A') #通配符写法 echo 'good' ;; [678][0-9]) #60-89 echo 'GBD' ;; [0-9]|[1-5][0-9]) #0-9,10-59 echo 'not good' ;; *) echo 'not a number' esac
实例
1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
if [ -e ~/test.sh ]
then
echo "存在test.sh"
if [ -x ~/test.sh ]
then echo "test.sh可执行"
else echo "test.sh无执行权限"
fi
else echo "不存在test.sh"
fi
2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,
如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
read -p 'input second' second
if [ $second -eq $second ] &>/dev/null
#用-eq排除非数字,由于输入非数字会输出错误报告,重定向到null设备
then
if [ $second -gt 0 ] && [ $second -le 10 ] #大于0s小于等于10s
then read -p 'input sexual(男女)' sexual
if [ $sexual == "男" ]
then echo "$second 晋级男组"
elif [ $sexual == "女" ]
then echo "$second 晋级女组"
else echo "性别错误"
fi
else echo "出局 $second"
fi
else echo "输入数字!"
fi
3.用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录
for name in *.tar.*
do
[[ $name == *.tar.gz ]] && a='gz'
[[ $name == *.tar.bz2 ]] && a='bz2'
case $a in
gz)
tar -xzvf $name -C /opt
;;
bz2)
tar -xjvf $name -C /opt
;;
*)
echo "bad"
esac
done
echo "complete"
read -p "请输入你要解压的文件:" file
case $file in ky28.tar.gz
*.tar.bz2)
echo "正在解压bz2文件至opt目录中....."
tar -jxvf $file -C /opt
;;
*.tar.gz)
echo "正在解压gz文件至opt目录中....."
tar -zxvf $file -C /opt
;;
*)
echo "文件格式有误,请重新输入文件"
esac
4.提示用户输入内容,使用if 语句判断输入的内容是否为整数。
read -p "input number" num
if [ $num -eq $num ] &>/dev/null
then
echo "整数"
else
echo "不是整数"
fi
5.根据上一题再判断输入的内容是奇数还是偶数。
read -p "input number" num
if [ $num -eq $num ] &>/dev/null
then
echo '整数'
if [ $(($num%2)) == 0 ]
then echo "偶数"
else echo "奇数"
fi
else
echo "不是整数"
fi
6.用if 语句判断主机是否存活
ping -c 5
[root@xue xue]# cat ping.sh
ping -c 5 192.168.80.101
if [ $? == 0 ]
then echo '存活'
else echo '不存活'
fi
ping -c 5 192.168.80.250
if [ $? == 0 ]
then echo '存活'
else echo '不存活'
fi
7.用case语句在/etc/init.d/目录中写一个firewalld脚本,并加入到系统服务管理中
使能够使用 service firewalld start|stop|restart|status 来管理firewalld服务,
要求如果命令选项不对,则提示 “用法: $0 {start|stop|status|restart}”。
read -p "输入start stop status restart以操作防火墙" choose
case $choose in
start)
service firewalld start
;;
stop)
service firewalld stop
;;
status)
service firewalld status
;;
restart)
service firewalld restart
;;
*)
echo "用法: $0 {start|stop|status|restart}"
esac