在bash中if实现条件测试;
条件测试类型:
整数测试
字符测试
文件测试
一、条件测试的表达式:
[ expression ] 括号两端必须要有空格
[[ expression ]] 括号两端必须要有空格
test expression
组合测试条件:
-a: and
-o: or
!: 非
第一种方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
!COMMAND 非
第二种方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION 非
二、数值测试 :
-eq 测试两个整数是否相等
-ne 测试两个整数是否不等
-gt 测试一个数是否大于另一个数
-lt 测试一个数是否小于另一个数
-ge 大于或等于
-le 小于或等于
命令间的逻辑关系
逻辑与:&&
第一个条件为假 第二个条件不用在判断,最总结果已经有
第一个条件为真,第二个条件必须得判断
逻辑或:||
三、字符串测试
== 是否等于
> ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
-z "STRING“ 字符串是否为空,空为真,不空为假
-n "STRING“ 字符串是否不空,不空为真,空为假
注意:用于字符串比较时的用到的操作数都应该使用引号
四、文件测试
-z string 测试指定字符是否为空,空着真,非空为假
-n string 测试指定字符串是否为不空,空为假 非空为真
-e FILE 测试文件是否存在
-f file 测试文件是否为普通文件
-d file 测试指定路径是否为目录
-r file 测试文件对当前用户是否可读
-w file 测试文件对当前用户是否可写
-x file 测试文件对当前用户是都可执行
-z 是否为空 为空则为真
-a 是否不空
-u file :是否存在且拥有suid权限
-g file :是否存在且拥有sgid权限
-k file :是否存在且拥有sticky权限
if语句
单分支
if 判断条件;then
条件为真的分支代码
fi
双分支
f 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件1; then
条件为真的分支代码
elif 判断条件2; then
条件为真的分支代码
elif 判断条件3; then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
示例脚本:
判断某字符串是否为整数
[root@localhost ~]# num=123; [[ "$num" =~ ^[0-9]+$ ]] && echo true
true
判断某字符串是否以.sh结尾
[root@localhost ~]# file=abc.sh ; [[ "$file" =~ ^.*\.sh$ ]] && echo true
true
判分.sh
#!/bin/bash
read -p "Please input your score: " score
if [[ ! "$score" =~ ^[0-9]+$ ]];then
echo "Your score is not interger"
exit 1
fi
if [ $score -lt 60 ];then
echo "You need study hard"
elif [ $score -ge 60 -a $score -lt 80 ];then
echo "You score is so so"
elif [ $score -ge 80 -a $score -le 100 ];then
echo "You score is very good"
else
echo "You score is invalid"
fi
练习:写一个×××系统,判断5个数字。
1 5 3 8 9
输入 第一个值。
输入 第二个值。
输入 第三个值。
输入 第四个值。
输入 第五个值。
每一步在输入完,都会判断,如果中了,则有输出结果:
第一次中输出 : First blood
第二次中输出 : Double kill
第三次中输出 :Triple kill
第四次中输出 :Quadra Kill
第五次中输出 :Penta Kill 以及 ACE!
一次也不中输出: Defeat!
[root@centos6mini app]# cat ./caipiao.sh
#bin/bash
n1=$(echo $[$RANDOM%10])
n2=$(echo $[$RANDOM%10])
n3=$(echo $[$RANDOM%10])
n4=$(echo $[$RANDOM%10])
n5=$(echo $[$RANDOM%10])
i=0
echo $n1 $n2 $n3 $n4 $n5
#取出5个数
read -p "请输入第1个数值: " s1
if [[ ! $s1 =~ ^[0-9]$ ]] ;then
echo "请输入10以内且为整数" ; exit 1
else
if [[ $s1 -eq $n1 ]];then
echo " First blood "
i=$[ $i+1 ]
else echo "错了!"
fi
fi
read -p "请输入第2个数值: " s2
if [[ ! $s2 =~ ^[0-9]$ ]] ;then
echo "请输入10以内且为整数"; exit 2
else
if [[ $s2 -eq $n2 ]];then
i=$[ $i+1 ]
if [[ i -eq 1 ]];then
echo "First blood"
elif [[ i -eq 2 ]];then
echo "Double kill"
elif [[ i -eq 3 ]] ;then
echo "Triple kill"
elif [[ i -eq 4 ]];then
echo "Quadra kill"
elif [[ i -eq 5 ]];then
echo " Penta kill and ACE "
else echo " Defeat "
fi
else echo "you错了!"
fi
fi
read -p "请输入第3个数值: " s3
if [[ ! $s3 =~ ^[0-9]$ ]] ; then
echo "请输入10以内且为整数"; exit 3
else
if [[ $s3 -eq $n3 ]];then
i=$[ $i+1 ]
if [[ i -eq 1 ]];then
echo "First blood"
elif [[ i -eq 2 ]];then
echo "Double kill"
elif [[ i -eq 3 ]] ;then
echo "Triple kill"
elif [[ i -eq 4 ]];then
echo "Quadra kill"
elif [[ i -eq 5 ]];then
echo " Penta kill and ACE "
else echo " Defeat "
fi
else echo "还有两次机会!"
fi
fi
read -p "请输入第4个数值: " s4
if [[ ! $s4 =~ ^[0-9]$ ]] ; then
echo "请输入10以内且为整数" ;exit 4
else
if [[ $s4 -eq $n4 ]];then
i=$[ $i+1 ]
if [[ i -eq 1 ]];then
echo "First blood"
elif [[ i -eq 2 ]];then
echo "Double kill"
elif [[ i -eq 3 ]] ;then
echo "Triple kill"
elif [[ i -eq 4 ]];then
echo "Quadra kill"
elif [[ i -eq 5 ]];then
echo " Penta kil and ACE "
else echo " Defeat "
fi
else echo "还有一次机会!"
fi
fi
read -p "请输入第5个数值: " s5
if [[ ! $s5 =~ ^[0-9]$ ]] ;then
echo "请输入10以内且为整数"; exit 5
else
if [[ $s5 -eq $n5 ]];then
i=$[ $i+1 ]
case $i in
1 ) echo "First blood" ;;
2 ) echo "Double kill" ;;
3 ) echo "Triple kill" ;;
4 ) echo "Quadra kill" ;;
5 ) echo " Penta kil and ACE " ;;
* ) echo " Defeat " ;;
esac
else echo "没有机会了 !!!"
fi
fi
编写一个菜单,
你好,要吃点什么?
1)面食
1.老碗面
1.小份:6元 2.大份:8元
2.牛肉面
1.小份:8元 2.大份:9元
3.热干面
0.原味 7元
1.加卤蛋 11元
2.加豆干 12元
3.都加 13元
2)饭
1.黄焖鸡
1.小份 15元 2.大份 20元
2.黄焖酥肉
1.小份 15元 2.大份 20元
3鸡公煲
小份12元 大份 20元
[root@centos6mini zuoye]# cat 10.sh
#!/bin/bash
read -p "你好请问吃点什么,我们这里有:1、面条和2、米饭: " a
case $a in
1|面|面条)
read -p "我们这里有:1、老碗面,2、牛肉面,3、热干面 : " b
case $b in
1|老碗面) read -p "我们分1、小份8元,你要2、大份还是10元 : " qw
case $qw in
1|大份|大份老碗面|大) echo "订餐完毕,请稍等!" ;;
2|小份|小份老碗面|小) echo "订餐完毕,请稍等!" ;;
*) echo "输入有误," ;;
esac
;;
2|牛肉面) read -p "我们分1、小份8元,你要2、大份还是10元 : " qe
case $qe in
1|大份|大份牛肉面|大) echo "订餐完毕,请稍等!" ;;
2|小份|小份牛肉面|小) echo "订餐完毕,请稍等!" ;;
*) echo "输入有误," ;;
esac
;;
3|热干面) read -p "我们分1、小份5元,你要2、大份还是8元 : " qr
case $qr in
1|大份|大份热干面|大) echo "订餐完毕,请稍等!" ;;
2|小份|小份热干面|小) echo "订餐完毕,请稍等!" ;;
*) echo "输入有误," ;;
esac
;;
*) echo "输入有误," ;;
esac ;;
2|米饭)
echo "请选着什么面食"
read -p "我们这里有:1、黄焖鸡,2、黄焖酥肉,3、鸡公煲 : " b
case $b in
1|黄焖鸡) read -qt "我们分1、小份12元,你要2、大份还是18元 : " qt
case $q in
1|大份|大份黄焖鸡|大) echo "订餐完毕,请稍等!" ;;
2|小份|小份黄焖鸡|小) echo "订餐完毕,请稍等!" ;;
*) echo "输入有误," ;;
esac
;;
2|黄嫩酥肉) read -p "我们分1、小份15元,你要2、大份还是20元 : " w
case $w in
1|大份|大份黄门酥肉|大) echo "订餐完毕,请稍等!" ;;
2|小份|小份黄门酥肉|小) echo "订餐完毕,请稍等!" ;;
*) echo "输入有误," ;;
esac
;;
3|鸡公煲) read -p "我们分1、小份15元,你要2、大份还是18元 : " p
case $p in
1|大份|大份鸡公煲|大) echo "订餐完毕,请稍等!" ;;
2|小份|小份鸡公煲|小) echo "订餐完毕,请稍等!" ;;
*) echo "输入有误," ;;
esac
;;
*) echo "输入有误," ;;
esac ;;
*) echo "输入有误," ;;
esac