目录
条件语句
条件判断
条件判断为0 true 真
条件判断为非0 false 假
条件测试
test 条件测试命令
格式1 test 条件测试表达式
格式2 [ -e test.txt ] 注意空格
-e 测试目录或者文件是否存在
-d 测试目录是否存在
-f 测试文件是否存在
-r 测试当前用户是否有读权限
-w 测试当前用户是否有写权限
-x 测试当前用户是否有执行权限
在代码中使用格式2配合if语句
整数比较的表达式
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
以上英文格式的整数表达式,只能用于比较整数
== 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
可以用字符串比较,也可以比较整数,两边类型要一样
逻辑测试
-a或&& 逻辑与,前后条件都满足
-o或|| 逻辑或,满足一个条件即可
写在一个[]中用字母表达式,写在
直接引用变量,最好用引号,特殊符号要慎用
[] [[]] 单双都是条件测试的语句,都可判断真假
双中括号 功能更强大 可以直接应用编量,不加引号不会出现歧义。支持正则表达式
if语句
单分支语句
if #条件测试
then
#命令
fi
双分支语句
if #条件测试
then
#命令
else
#命令
fi
多分支语句
if #条件测试
then
#命令
elif #条件测试
then
#命令
else
#命令
fi
case语句
case语句结构
case语句结构特点
case行尾必须为单词 in 每个模式必须以右括号 ) 结束
双分号 ;; 表示命令序列结束
匹配模式中可是使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或。
最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后的命令序列
以esca结尾
case 变量值 in
模式1)
命令1
;;
模式2)
命令2
;;
......
*)
命令n
esac
实验
例一
检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
[ -e /home/test.sh ]
if [[ $? -eq 0 ]]
then
echo "存在"
[ -x /home/test.sh ]
if [[ $? -eq 0 ]]
then
echo "有执行权限"
else
echo "没有执行权限"
fi
else
echo "不存在"
fi
例二
提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,
如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,
男生进男生组,女生进女生组,如果输入错误请提示错误
read -p "输入100米秒数:" sec
if [ $sec -eq $sec ] &> /dev/null
then
if [[ $sec -gt 0 && $sec -le 10 ]]
then
echo "进入淘汰赛"
read -p "输入性别:" sex
if [[ $sex == "男" ]]
then
echo "进入男生组"
elif [[ $sex == "女" ]]
then
echo "进入女生组"
else
echo "输入错误"
fi
elif [[ $sec -gt 10 ]]
then
echo "淘汰"
else
echo "输入错误"
fi
else
echo "输入错误"
fi
例三
用case语句解压压缩包到 /opt 目录
read -p "请输入包名" decompress
case $decompress in
*.tar.bz2)
tar -xf $decompress -C /opt/
;;
*.tar.gz)
tar -xf $decompress -C /opt/
;;
*)
echo "无压缩包"
esac
例四
根据判断输入的内容是奇数还是偶数
read -p "请输入数字" num
if [ $num -eq $num ] &> /dev/null
then
if num1=$(($num%2))
[[ $num1 -eq 0 ]]
then
echo "偶数"
else
echo "奇数"
fi
else
echo "非整数"
fi
例五
用case语句控制 firewalld start|stop|restart|status 来管理firewalld服务,
要求如果命令选项不对,则提示输入不正确
read -p "请输入指令:" order
case $order in
start)
systemctl start firewalld
;;
stop)
systemctl stop firewalld
;;
restart)
systemctl restart firewalld
;;
status)
systemctl status firewalld
;;
*)
echo "指令输入错误"
esac