shell条件语句及判断

shell条件语句及判断

一、条件测试:文件测试、整数比较、字符串比较、逻辑测试;

条件测试语法:
test 条件表达式 或 [ 条件表达式 ]
echo $? ##如果返回值为0,则条件成立
文件测试:
[ 操作符 文件或目录 ]
操作符:-f ##是否是文件 -d ##测试是否是目录 -e ##测试是否存在
-r ##测试是否有读取权限 -w ##测试是否有写入权限 -x ##测试是否有执行权限
整数比较:
语法:[ 数1 操作符 数2 ] ##数字可引用变量,必须是整数
echo $? ##查看返回值,若为0则成立
操作符:-gt 大于 -ge 大于等于 -eq等于 -lt小于
-le 小于等于 -ne不等于
字符串比较:通常用于比较变量的值
语法:[ str1 == str2 ] ##判断字符串1等于字符串2
[ str1 != str2 ] ##判断字符串1不等于字符串2
[ -z str1 ] ##判断字符串1为空,例:[ -z $A ],若变量A存在则返回值为1,若不存在则为0
逻辑测试:
语法:[ 表达式1 ] && [ 表达式2 ] ##若表达式1与表达式2都成功时,才会成功,“和““与”;
[ 表达式1 ] || [ 表达式2 ] ##表达式1或2有一个成功时,就会成功,“或”;
! [ 表达式1 ] ##若表达式1不成立时,则为成功,“非”;

二、if条件语句:单分支、双分支、多分支

单分支:
语法:if [ 条件表达式 ];then
命令操作
fi
注:单分支只有在条件成立时,才会执行命令操作;
双分支:
语法:if [ 条件表达式 ];then
命令操作1
else
命令操作2
fi
注:if的双分支时,条件表达式成立时,则执行命令操作1,若条件表达式不成立时,则执行命令操作2;
多分支:
语法:if [ 条件表达式1 ];then
命令操作1
elif [ 条件表达式2 ];then
命令操作2
elif 省略...
else
默认命令操作
fi
注:if多分支时,依次判断条件表达式1,2,...,如果满足其中某个条件则执行对应命令操作,若所有条件表达式都不满足,则执行最后的默认命令操作;

三、扩展:

1.basename 文件位置 ##将一个文件的路径去除掉,只显示文件的名称;
2.arping -I eth0 -f 目标ip地址 ##ping对方主机并显示其MAC地址;
3.seq 1 10 ##输出1到10之间的所有整数到屏幕,默认是强制换行的;
4.expr $RANDOM % 100 ##生成100内的随机数,expr可以用来运算变量或者整数、例如:
expr $A + $B ## 加+ 减- 乘* 除/ 取余%

shell脚本的测试与判断

1.测试
语法:
[ 操作符 条件 ] == test 操作符 条件

测试的操作符:-f 文件,-d 目录, -e 是否存在,-r 是否可读,-w 是否可写 , -x 是否可执行
案例:
[ -d /tmp ]
echo $?

2)整数的比较
操作符:
-eq 等于,-ne 不等于, -gt 大于, -lt 小于,ge 大于等于,le 小于等于
案例:
[ 10 -gt 11 ]
echo $?

3)字符串比较
字符串:指一种数据类型,可以理解位纯文本类型。
操作符:== 是否相等, != 不相等 , -z 是否为空
案例:
STR1=hehe
[ $STR1 == hehe ]
echo $?
[ $STR1 != linuxfan.cn ]
echo $?
STR2= ##直 接回车
echo $?
[ -z $STR2 ]
echo $?

4)逻辑判断
逻辑判断即与或非。
语法:
[ 表达式1 ] &&(与),||(或) ,!(非) [ 表达式2 ]
命令1 &&,||,! 命令2
案例:
编译安装:
./configure &&make &&make
[ 1 –ge 2 ] || [ 1 –lt 2 ] ##测试结果为真
echo $?

案例一:判断lftp是否安装若未安装则安装

#!/bin/bash
rpm  -qa  |grep lftp 1>/dev/null
if  [ $? -ne 0 ];then
    yum  -y  install lftp  &>/dev/null &&echo “lftp  installed.”
fi

案例二:判断主机CPU占用率

#!/bin/bash
CHK_CPU=$(top -b -n 5 | grep Cpu |awk '{print $2}' |awk -F '%' '{print $1}'|tail -1)
NUM=$(echo "$CHK_CPU*10" |bc |awk -F '.' '{print $1}')
if [ $NUM -ge 10 ]
    then
        echo "CPU is high"
fi

案例三:判断lftp是否安装若未安装则安装,安装则卸载;

#!/bin/bash
rpm  -qa  |grep lftp 1>/dev/null
if  [ $? -ne 0 ];then
    yum  -y  install lftp  &>/dev/null &&echo “lftp  installed.”
else
    rpm -e lftp --nodeps &>/dev/null &&echo "lftp is remove"
fi

案例四:测评分数脚本

#!/bin/bash
while true;do
    read -p "请输入你的分数(退出输入exit):" NUM
if [[ $NUM == exit ]];then
            echo "谢谢使用!!!"
        exit
else
        expr $NUM + 1 &>/dev/null
        if [ $? -ne 0 ];then
                    echo "输入的分数只能为0-100的整数!"
        elif [ -z $NUM ];then
                    echo "输入的分数不能为空;"
        elif [ $NUM -eq 0 ];then
                    echo "完美的避过了所有的正确答案!"
        else
                if [ $NUM -le 100 ]&&[ $NUM -ge 85 ];then
                    echo "优秀!"
                elif [ 85 -ge $NUM ]&&[ 60 -le $NUM ];then
                    echo "良好!"
                else
                    echo "不及格!"
                fi
        fi
fi
done

案例五:测评分数脚本优化后

#!/bin/bash
while true
do
    read -p "请输入分数(退出输入exit)": COST

if [ "$COST" == "exit" ];then
  echo -e "\n谢谢使用本次查询,再见!"
  exit 0
elif [ "$COST" == "0" ];then
  echo -e "\n您没有参加测试;"
else
  expr $COST + 0 &>/dev/null
        if [ $? != 0 ];then
          echo -e "\n(输入的分数应为纯数字形式,请重新输入!)"
        else
                if [ 100 -ge $COST ] && [ $COST -ge 85 ];then
                  echo -e "\n优秀\n"
                elif [ 84 -ge $COST ] && [ $COST -ge 60 ];then
                  echo -e "\n良好\n"
                elif [ 60 -gt $COST ] && [ $COST -ge 0 ];then
                  echo -e "\n差\n"
                else
                  echo -e "\n(输入的分数超出正常范围,请重新输入!)"
                fi

        fi
fi
done

案例六:数值比较脚本

[root@ns bin]# cat if_then_fi.sh 
#!/bin/bash
name=$(basename $0)     ##$0代表脚本本身,basname的作用将脚本文件的完整路径省略掉,直接显示脚本文件的名
if [ $# -ne 2 -a $# -ne 3 ];then    ##若脚本后边跟的数值不是两个也不是三个的时候
        echo "Usage:"
        echo "$name vaule1 value2"
        echo "$name value1 value2 vaule3"
        exit 1
elif [ $# -eq 2 ];then     ##若脚本后边跟的数值是两个的时候,返回两个值得内容,若不是两个,那么就是三个,返回三个值的内容
        echo "two args:$1,$2"
  if [ $1 -gt $2 ];then
     echo "$1 > $2"
  elif [ $1 -lt $2 ];then
     echo "$1 < $2"
  else
     echo "$1 = $2"
  fi
elif [ $# -eq 3 ];then
        echo "three args:$1,$2,$3"
  if [ $1 -gt $2 -a $1 -gt $3 ];then
     echo "$1 >$2,$1 >$3"
  elif [ $1 -gt $2 -a $1 -lt $3 ];then
     echo "$1 >$2,$1 < $3"
  elif [ $1 -gt $2 -a $1 -eq $3 ];then
     echo "$1 > $2,$1 = $3"
  elif [ $1 -lt $2 -a $1 -gt $3 ];then
     echo "$1 < $2,$1 > $3"
  elif [ $1 -lt $2 -a $1 -lt $3 ];then
     echo "$1 < $2,$1 < $3"
  elif [ $1 -lt $2 -a $1 -eq $3 ];then
     echo "$1 < $2,$1 = $3"
  fi
fi
exit 0    ##退出,返回值为0,正常退出
[root@ns bin]#./if_then_fi.sh 1 2   ##进行测试,1和2 是测试的值

案例七:数值比较脚本优化后

[root@ns bin]# cat if_then_fi.sh 
#!/bin/bash
name=$(basename $0)     ##$0代表脚本本身,basname的作用将脚本文件的完整路径省略掉,直接显示脚本文件的名
if [ -z $1 ]||[ -z $2 ];then
        echo "value1 or value2 not setting Empty"
        exit 1
elif [ $# -ne 2 -a $# -ne 3 ];then    ##若脚本后边跟的数值不是两个也不是三个的时候
        echo "Usage:"
        echo "$name vaule1 value2"
        echo "$name value1 value2 vaule3"
        exit 1
else
        expr $1 + 1 &>/dev/null
        A=$(echo $?)
        expr $2 + 1 &>/dev/null
        B=$(echo $?)
        if [ $A -ne 0 ] || [ $B -ne 0 ];then
                echo "value1 or value2 need setting integral( 0 - ~ )"
        elif [ $# -eq 2 ];then     ##若脚本后边跟的数值是两个的时候,返回两个值得内容,若不是两个,那么就是三个,返回三个值的内容
                echo "two args:$1,$2"
                if [ $1 -gt $2 ];then
                        echo "$1 > $2"
                elif [ $1 -lt $2 ];then
                        echo "$1 < $2"
                else
                        echo "$1 = $2"
                fi
        elif [ $# -eq 3 ];then
                echo "three args:$1,$2,$3"
                if [ $1 -gt $2 -a $1 -gt $3 ];then
                        echo "$1 >$2,$1 >$3"
                elif [ $1 -gt $2 -a $1 -lt $3 ];then
                        echo "$1 >$2,$1 < $3"
                elif [ $1 -gt $2 -a $1 -eq $3 ];then
                        echo "$1 > $2,$1 = $3"
                elif [ $1 -lt $2 -a $1 -gt $3 ];then
                        echo "$1 < $2,$1 > $3"
                elif [ $1 -lt $2 -a $1 -lt $3 ];then
                        echo "$1 < $2,$1 < $3"
                elif [ $1 -lt $2 -a $1 -eq $3 ];then
                        echo "$1 < $2,$1 = $3"
                fi
        fi
fi
exit 0    ##退出,返回值为0,正常退出
[root@ns bin]# ./if_then_fi.sh 1 d
value1 or value2 need setting integral( 0 - ~ )
[root@ns bin]# ./if_then_fi.sh 1 30
two args:1,30
1 < 30
[root@ns bin]# ./if_then_fi.sh
value1 or value2 not setting Empty

案例八:编译安装的httpd服务控制脚本

#!/bin/bash
if [ $1 == start ];then
    netstat -utpln |grep 80 &>/dev/null
    if [ $? -eq 0 ];then
        echo "httpd is started!"
        exit 1
    else
    /usr/local/httpd/bin/apachectl start &>/dev/null
    echo "+/usr/local/httpd/bin/apachectl start"
    echo "+netstat -utpln |grep 80" 
    netstat -utpln |grep 80
    PID=$(netstat -utpln |grep 80 |awk '{print $7}'|awk -F'/' '{print $1}')
    echo -e "httpd is running ! PID is $PID"
    fi
elif [ $1 == stop ];then
    netstat -utpln |grep 80 &>/dev/null
    if [ $? -ne 0 ];then
        echo "httpd is stoped!"
        exit 1
    else
    /usr/local/httpd/bin/apachectl stop &>/dev/null
    echo "+/usr/local/httpd/bin/apachectl stop"
    sleep 2
    echo "+netstat -utpln |grep 80"
    netstat -utpln |grep 80
        if [ $? -ne 0 ];then
            echo "httpd is stopping!"
        fi
    fi
elif [ $1 == restart ];then
    netstat -utpln |grep 80 &>/dev/null
    if [ $? -ne 0 ];then
        echo "httpd not is started!"
        /usr/local/httpd/bin/apachectl start &>/dev/null
            echo "+/usr/local/httpd/bin/apachectl start"
            sleep 2
            echo "+netstat -utpln |grep 80"
            netstat -utpln |grep 80
            if [ $? -eq 0 ];then
                    echo "httpd is started!"
            fi
    else
    /usr/local/httpd/bin/apachectl stop &>/dev/null
        echo "+/usr/local/httpd/bin/apachectl stop"
    sleep 2
    /usr/local/httpd/bin/apachectl start &>/dev/null
        echo "+/usr/local/httpd/bin/apachectl start"
    sleep 2
        echo "+netstat -utpln |grep 80"
        netstat -utpln |grep 80
            if [ $? -eq 0 ];then
                    echo "httpd is started!"
            fi
    fi
elif [ $1 == status ];then
    netstat -utpln |grep 80 &>/dev/null
    if [ $? -eq 0 ];then
        echo "httpd is running!"
        PID=$(netstat -utpln |grep 80 |awk '{print $7}'|awk -F'/' '{print $1}')
            echo -e "httpd is running ! PID is $PID"
    else
        echo "httpd is not running!"
    fi
else
    echo "Usage: /etc/init.d/httpd start|stop|restart|status "
fi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值