分享

shell条件语句及判断

 夜猫速读 2022-05-16

一、测试条件;

二、if条件语句;

三、扩展;

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

条件测试语法:

  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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多