Shell编程之条件语句(条件测试、if、case)

Shell编程之条件语句

条件测试

文件测试与整数测试

  • test命令

    • 测试表达式是否成立,成立返回0,否则返回其他数值
      • 格式1:test 条件表达式 //注意比较符号加空格
      • 格式2:[ 条件表达式 ] //条件表达式左右要有空格
  • 文件测试

    • [ 操作符 文件或目录 ]

    • 常用的测试操作符(成立返回0,否则返回其他值)(引申也可以判断文件是否存在)

      • -d:测试是否为目录(Directory)
      • -e:测试目录或文件是否存在(Exist)
      • -f:测试是否为文件(File)
      • -r:测试当前用户是否有权限读取(Read)
      • -w:测试当前用户是否有权限写入(Write)
      • -x:测试当前用户是否有权限执行(Excute)
      • -L:测试是否为符号链接

      [ 操作符 文件或目录 ] && echo "YES" //&&前面表达式成立才会执行echo

  • 整数值比较

    • [ 整数变量 操作符 整数变量 ]

    • 常用的测试操作符

      • -eq:等于(Equal)

      • -ne:不等于(Not Equal)

      • -gt :大于(Greater Than)

      • -lt :小于(Lesser Than)

      • -le :小于或等于(Lesser or Equal)

      • -ge:大于或等于(Greater or Equal)

      [ $(who | wc -l) -gt 5] && echo "Too many." //用户数大于5则输出Too many

      [ $(who | wc -l) -ge 5] && echo ">=5" //用户数大于等于5则输出>=5

      # 内存空间是否小于1024
      FreeCC=$(free -m | grep "Mem:" | awk '{print $4}')
      [ $FreeCC -lt 1024 ] && echo ${FreeCC}MB 
      
      # 计算内存使用率
      USED=$(free | grep "Mem:" | awk '{print $3}')
      TOTAL=$(free | grep "Mem:" | awk '{print $2}')
      # USED_PRE=$(echo "scale=2;$USED/$TOTAL*100" | bc |awk -F. '{print $1}')
      USED_PRE=$(awk "BEGIN {print $USED/$TOTAL*100}" |awk -F. '{print $1}')
      

字符串测试与逻辑测试

  • 字符串比较

    • 格式1:[ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2 ]

    • 格式2:[ -z 字符串 ]

    • 常用的测试操作符

      • =:字符串内容相同
      • !=:字符串内容不同
      • -z:字符串长度是否为0(为0时返回true),对于未定义或赋予空值的变量将视为空串
      • -n:判断字符串是否不为0(不为0返回true),(需要用双引号引用字符串)

      [ -z $(cat abc.txt) ] //判断文件是否为空

      [ -z $abc ] //判断变量是否有值

      [ -n "$abc" ] //判断变量是否为空

  • 逻辑测试

    • 格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...(操作符只能用&&或者||)

    • 格式2:[ 命令1 操作符 命令2 ... ] (操作符只能用-a或者-o)

    • 常用的测试操作符

      • -a或&&:逻辑与,“而且”的意思(都成立才成立)
      • -o或||:逻辑或,“或者”的意思(成立一个即成立)
      • !:逻辑否

      [ $a -eq 5 ] && [ $a -ne 10 ]相当于[ $a -wq 5 -a $a -ne 10]

      想在同一个表达式中使用&&和||,要用[[ ]]括起来

      [ 2 -lt 3 ] && echo true || echo false //2小于3时执行echo true否则执行echo false,类似编程语言的三元运算符

      #!/bin/bash
      #自动探测目标主机是否存活
      
      ping -c 3 -i 0.5 -w 2 $1 &> /dev/null && echo "$1 online" || echo "$1 offline"   #指定3个包,间隔0.5s,最多等待2s
      

if语句

if单分支语句

  • 格式

    if 条件测试操作
    	then 命令序列
    fi
    
  • #!/bin/bash
    # 单分支实现磁盘使用率过高报警
    
    USAGE=`df | grep "/dev/sda2" | awk '{print $5}' | awk -F% '{print $1}'`
    if [ $USAGE -gt 70 ]
    then
    	echo "警告!当前磁盘使用率过高,已达到${USAGE}%"
    fi
    

if双分支语句

  • 格式

    if 条件测试操作
    	then 命令序列1
    	else 命令序列2
    fi
    
  • #!/bin/bash
    # 双分支实现httpd服务的自动安装启动
    
    netstat -natp | grep :80 &> /dev/null # 查看端口状态
    
    if [ $? -eq 0 ]
    then
    	echo "网站服务已运行!"
    else
    	rpm -q httpd &> /dev/null # 查看服务是是否已经安装
    	if [ $? -eq 0]
    	then
    	echo "httpd服务已安装,正在开启服务......"
    	systemctl start httpd
    else
    	echo "正在安装httpd服务,并准备启动......"
    	yum install -y httpd &> /dev/null   # 默认已安装yum仓库
    	systemctl start httpd
    	fi
    fi
    

if多分支语句

  • 格式

    if 条件测试操作
    	then 命令序列1
    elif 条件测试操作2
    	then 命令序列2
    else
    	命令序列3
    fi
    
  • #!/bin/bash
    # 多分支实现成绩分析
    
    read -p "请输入你的分数(0-100):" score
    
    if [ $score -eq 100 ]
    then
    	echo "100分,非常优秀!"
    elif [ $score -ge 90 ] && [ $score -lt 100 ]
    then
    	echo "$score分,很优秀。"
    elif [ $score -ge 70 ] && [ $score -lt 90 ]
    then
    	echo "$score分,良好。"
    elif [ $score -ge 60 ] && [ $score -lt 70 ]
    then
    	echo "$score分,及格。"
    elif [ $score -ge 0 ] && [ $score -lt 60 ]
    then
    	echo "$score分,不及格。"
    else
    	echo "输入有误"
    fi
    

case分支语句

  • case多分支结构

    case 变量值 in
    
    模式1)
    	命令序列1
    	;;
    模式2)
    	命令序列2
    	;;
    	......
    *)
    	默认命令序列
    esac
    
  • #!/bin/bash
    # case分支改写上一实验
    
    read -p "xx+(0-100):" score
    
    case $score in
    100)
    	echo "100分,非常优秀!"
    	;;
    9[0-9])    # 90~99分
    	echo "$score分,很优秀。"
    	;;
    [78][0-9]) # 70~89分
    	echo "$score分,良好。"
    	;;
    6[0-9])    # 60~69分
    	echo "$score分,及格。"
    	;;
    [0-9]|[1-5][0-9])  # 0~9分和10到59分
    	echo "$score分,不及格。"
    	;;
    *)
    	echo "输入有误"
    esac
    
  • 使用case编写一个自定义service服务

    cd /etc/init.d

    vim firewalld

    #!/bin/bash
    # chkconfig 2345 99 20
      
    case $1 in
    start)
    	systemctl start firewalld
      	;;
      
    stop)
      	systemctl stop firewalld
      	;;
      
    restart)
      	$0 stop
      	$0 start
      	;;
      	
    status)
      	systemctl status firewalld
      	;;
    *)
      	echo "Usage: $0 {start|stop|resatrt|status}"
    esac
    

    chmod +x firewalld

    chkconfig --add firewalld

    service firewalld stop //测试关闭命令

    service firewalld status //测试命令

    systemctl status firewalld //测试命令

    service firewalld start //测试命令

    systemctl status firewalld //测试命令

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值