shell条件测试
test命令
$? 返回码,可以用于判断最近一次的命令或者脚本是否执行成功
状态:
0 true 为真就是成立
非0 flase 为假就是失败或者异常
test命令 可以进行条件测试,然后根据的是返回值来判断条件是否成立.
test -e 文件或者目录 #测试文件或者目录是否存在
echo $? # 返回结果
test -d 目录 #测试目录是否存在
test -f 文件 #测试文件是否存在
test -r #测试当前用户是否对文件或者目录有读权限
test -w #测试是否有写权限
test -x #测试是否有执行权限
比较符
-eq #等于 == #既可以比较整数,也可以比较字符串
-ne #不等于 != #表示不等于
-gt #大于 >
-lt #小于 <
-ge #大于等于 >=
-le #小于等于 <=
第二种形式
[ 3 > 5 ]
[3 -gt 5 ]
[ test == test1 ]
第三种形式
[[ ]] 可以使用更高级的模式,可以使用正则表达式,而且在双括号中,"变量"的""可以不加,原本加""是为了避免歧义,[[]]避免了歧义
第四种
(( )) 运算符
逻辑符号
&& 与,并且 条件都满足才成立 有些也可以用-a
|| 或者 有一个条件满足就成立 也可以用-o
[ $a -ne 1 ] && [ $a -ne 2 ]
[ $a -ne 1 -a $a -ne 2 ]
[ $a -ne 1 ] || [ $a -ne 2 ]
[ $a -ne 1 -o $a -ne 2 ]
双中括号只能用&&和||
[[ $a -gt 4 && $a -lt 6 ]]
[][][[ $a -gt 4 || $a -lt 6 ]]
if语句
单分支结构:
vim if.sh
if [ 3 -gt 2 ] #条件测试语句
then #命令序列,只有条件测试语句成立,才会执行then里面的命令模块
echo "ok"
fi #结束语句
双分支结构:
if [ 3 -gt 2 ]
then #条件满足执行then,不满足执行else
echo "ok"
else
echo "ok"
fi
多分支结构:
if [ ]
then
命令序列
elif [ ]
then
命令序列
elif [ ]
then
命令序列
else
命令序列
fi
if嵌套
if [ ]
then
case语句
相当于多分支结构
case 变量值 in
模式1)
命令序列
;;
模式2)
命令序列
;;
*)
命令序列
esac
试验
1.单分支
通过位置变量传参的方式,给脚本内部传一个ip地址
ping的通的要提示用户ip is online 而且要保存到/opt/hosts.txt文件
ping不通,提示用户 ip is offline
vim login1.sh
ping -c 3 $1
result=$?
if [[ $result -gt 0 ]]
then
echo "ip is offline"
else
echo "ip is online"
echo $1 >> /opt/hosts.txt
fi
:wq
bash login1.sh 192.168.118.10
2.双分支
随机输入一个整数,read -p输入一个整数
判断这个数是偶数还是技术,偶数提示偶数,奇数提示奇数
vim login2.sh
read -p "请输入一个数" num
if [[ $(($num % 2)) -eq 0 ]]
then
echo "$num" "是个偶数"
else
echo "$num" "是个奇数"
fi
:wq
bash login2.sh
3.嵌套多分支
只有整数才可以进行进入到分数的区间
请输入您的分数,0~100
大于等于85,且小于等于100 优秀
大于等于70,且小于等于84 一般
如果大于等于60,且小于等于69 合格
小于60 三十遍
只有整数才可以进行进入到分数的区间
vim login3.sh
read -p "输入你的分数:" score
if [[ $score -eq $score ]] &> /dev/null
then
if [[ $score -ge 85 && $score -le 100 ]]
then
echo "优秀"
elif [[ $score -ge 70 && $score -le 84 ]]
then
echo "一般"
elif [[ $score -ge 60 && $score -le 69 ]]
then
echo "合格"
else
echo "三十遍"
fi
else
echo "夏季波协"
fi
:wq
bash login3.sh
4.case语句
read -p "输入一个成绩: " num
[[ $num -ge 80 && $num -le 100 ]] && a="great"
[[ $num -ge 70 && $num -le 79 ]] && a="standard"
[[ $num -ge 60 && $num -le 69 ]] && a="false"
case $a in
great)
echo "$num分,优秀"
;;
standard)
echo "$num分,优秀"
;;
false)
echo "$num分,优秀"
;;
*)
esac
练习题!
1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
test -e $1
result=$?
if [[ $result -eq 0 ]]
then
echo "文件存在"
test -x $1
result=$?
if [[ $result -gt 0 ]]
then
echo "文件没有执行权限"
else
echo "文件有执行权限"
fi
else
echo "文件不存在"
fi
2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,
大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别。
男生进男生组,女生进女生组,如果输入错误请提示错误(整数判断,小数判断。9.72 3.21 )
read -p "100米所用的秒数:" sec
if [[ $sec -eq $sec ]]
then
if [[ $sec -gt 0 && $sec -le 10 ]]
then
echo "进入选拔赛"
read -p "请输入性别:" sex
if [[ $sex == "男" ]]
then
echo "进入男子组"
elif [[ $sex == "女" ]]
then
echo "进入女子组"
else
echo "???你性了个什么别?"
fi
else
echo "淘汰"
fi
else
echo "请重新输入"
fi
3.用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录
read -p "请输入所传包的格式" input
[[ $input == .tar.gz ]] && moshi=".tar.gz"
[[ $input == .tar.bz2 ]] && moshi=".tar.bz2"
case $moshi in
.tar.gz)
echo "即将解压到/opt/rh目录下"
tar -zxvf $1 -C /opt
;;
.tar.bz2)
echo "即将解压到/opt/rh目录下"
tar -jxvf $1 -C /opt
;;
esac
4.提示用户输入内容,使用if 语句判断输入的内容是否为整数。判断范围0-100。
read -p "请输入一个数(0-100)" num
if [[ $num -eq $num ]] &> /dev/null
then
if [[ $num -gt 0 && $num -lt 100 ]]
then
echo "整数在0-100之间"
else
echo "整数不在0-100之间"
fi
else
echo "不是个整数"
fi
5.根据上一题再判断输入的内容是奇数还是偶数。
read -p "请输入一个数(0-100)" num
if [[ $num -eq $num ]] &> /dev/null
then
if [[ $num -gt 0 && $num -lt 100 ]]
then
echo "整数在0-100之间"
if [[ $(( $num %2 )) -eq 0 ]]
then
echo "是个偶数"
else
echo "是个奇数"
fi
else
echo "整数不在0-100之间"
fi
else
echo "不是个整数"
fi
6.用if 语句判断主机是否存活.保存到/opt/hosts.txt
ping -c 5 不显示ping的过程
read -p "请输入ip地址" ipinput
ping -c 5 $ipinput &> /dev/null
result=$?
if [[ $? -eq 0 ]]
then
echo "能ping通,即将保存到/opt/hosts.txt"
echo $ipinput >> /opt/hosts.txt
else
echo "ping不通"
fi
7.用case语句控制 firewalld start|stop|restart|status 来管理firewalld服务,
要求如果命令选项不对,则提示输入不正确: {start|stop|status|restart}"。
echo "请选择对firewalld的管理项:\nstart|stop|restart|status: "
read -p " " input
#[[ $input -eq $input ]] && moshi=start
#[[ $input -eq $input ]] && moshi=stop
#[[ $input -eq $input ]] && moshi=restart
#[[ $input -eq $input ]] && moshi=status
case $input in
start)
echo "启动防火墙"
systemctl start firewalld
;;
stop)
echo "关闭防火墙"
systemctl stop firewalld
;;
restart)
echo "重启防火墙"
systemctl restart firewalld
;;
status)
echo "防火墙状态"
systemctl status firewalld
;;
*)
echo "输入不正确: {start|stop|status|restart}"
esac