Linux shell编程 条件语句if case

条件测试

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值