Shell ❀ 条件判断语句

Posted 无糖可乐没有灵魂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell ❀ 条件判断语句相关的知识,希望对你有一定的参考价值。

文章目录

四、条件判断

常见的if条件语句分为三种:单分支、双分支、多分支;

1、if 单分支格式

1.1 语法格式

# if与then分隔
if <条件表达式>
then          #当条件满足表达式时,执行指令
    指令
fi

# if与then相连
if <条件表达式>;then
    指令
fi

1.2 操作案例

  1. 判断当前系统剩余内存大小,若低于100M,进行告警。
[root@localhost shell]#  cat freeMem.sh 
#!/bin/bash

freeMem=`free -m | grep -w Mem | tr -s " " | cut -d " " -f 4`
#反引号内容为执行指令,执行结果赋值给新对象freeMem

if [ $freeMem -le 100 ]
	then
		echo "内存已满,请及时清理!"   
  #当freeMem小于100时,执行echo语句
	else
		echo "内存充足!"
  #当freeMem大于或等于100时,执行echo语句              
fi

#提取内存大小其他简便方法(推荐使用sed与awk命令为shell编程语句提取数值)
[root@localhost ~]# free -m | awk '/Mem:/ print $4'
1614
  1. 判断当前脚本执行者,如果不是root用户,提示用户脚本需要root用户来执行。
[root@localhost shell]#  cat a3.sh 
#!/bin/bash

if [ $USER == "root" ];then
	echo "is root!"
else
	echo "not is root!"
fi

2、if-else 双分支格式

2.1 语法格式

if <条件表达式>
then          #当条件满足表达式时,执行指令1
	指令1     
else          #当条件不满足表达式时,执行指令2
	指令2
fi

2.2 操作案例

  1. 检查主机CPU是Intel还是AMD。
[root@localhost shell]#  cat a6.sh 
#!/bin/bash

vendor=`cat /proc/cpuinfo | grep vendor_id | uniq | tr -s " " | cut -d " " -f 2`
#uniq 去除重复出现的行
#tr -s 字符串去重,只保留第一个重复字符

if [[ $vendor=="Genuinelnmtel" ]];then
	echo "is intel!"
elif [[ $vendor=="AuthenticAMD" ]];then
	echo "is AMD!"
else
	echo "is other!"
fi

3、if-elif-else 多分支结构

3.1 语法格式

if <条件表达式1>
then          #当条件满足表达式1时,执行指令1
    指令1
elif <条件表达式2>
then          #当条件满足表达式2时,执行指令2
    指令2
else          #当条件不满足表达式1与2时,执行指令3
    指令3
fi

3.2 操作案例

  1. 根据用户输入数字,判断其优良中差。
[root@localhost shell]# cat test.sh
#!/bin/bash

read -p "Please enter your score(0-100):" grade
#输入一个数值,范围区间为0-100之内,将其赋值给定义新对象grade

if [ $grade -ge 85 ]
        then
                echo "$grade,优"
                #若grade的值大于85,则返回优
        elif [ $grade -ge 70 ]
                then
                        echo "$grade,良"
                        #若grade的值介于85和70之间,则返回良
        elif [ $grade -ge 60 ]
                then
                        echo "$grade,中"
                        #若grade的值介于70和60之间,则返回中
        else
                echo "$grade,差"
                #其他情况,返回差
fi

4、( ) 和 复合指令

复合指令:一串命令的集合,( ) 都是对一串命令进行执行;

4.1 相同点

  • ( ) 都是把一串命令放在括号内,用;间隔;

  • ( ) 某个命令的重定向只影响该命令,但是括号外的重定向则影响括号李的所有命令;

4.2 不同点

  • ( )只是对一串命令重新开一个子shell进行执行, 对一串命令在当前shell执行;

  • ( ) 最后一个命令可以不用 ; 最后一个命令要用;结束;

  • ( ) 第一个命令和左边括号不需要有空格, 第一个命令必须和左边括号有空格;

5、exit退出程序

exit语句的基本作用是终止shell程序的执行,此外exit可以附带一个可选参数,用来指定程序退出时的状态码;

exit [status]

​ 其中,status表示退出状态,该参数是一个整数值,取值范围为0-255,;

[root@localhost shell]#  cat vendor.sh 
#!/bin/bash

vendor=`cat /proc/cpuinfo | grep vendor_id | uniq | tr -s " " | cut -d " " -f 2`
if [[ $vendor=="Genuinelnmtel" ]];then
	echo "is intel!"
elif [[ $vendor=="AuthenticAMD" ]];then
	echo "is AMD!"
else
	echo "is other!"
fi
exit 6          
#指定退出状态为6,若不为6代表脚本执行失败,以此可以判断脚本执行错误位置
[root@localhost shell]#  echo $?
6

6、case 多条件判断语句

6.1 语句格式

case 变量名 in
    值1)
        指令1
        #当变量选择值1时,执行指令1
    ;;
    值2)
        指令2
        #当变量选择值2时,执行指令2
    ;;
    值3)
        指令3
        #当变量选择值3时,执行指令3
    ;;
    *)
        默认指令
        #当变量选择值为其他时,执行默认指令
esac

6.2 操作案例

  1. ping主机测试
[root@localhost shell]# cat ping_ip.sh 
#!/bin/bash

read -p "Please enter youer ip.address(1-254):" ip_addr
#输入一个数值,范围区间为1-254之内,将其赋值给定义新对象ip_addr
ping -c 2 10.81.20.$ip_addr &> /dev/null
#将变量ip_addr的值调用,并执行命令,结果指空(指空:当前终端无任何命令执行结果的回显信息)

if [ $? -eq 0 ];then
	echo "is ok!"
   #若命令执行成功,则代表可以ping通
else
	echo "is down!"
   #若命令执行失败,则代表不能ping通
fi
  1. 判断一个用户是否存在
[root@localhost shell]# cat username.sh 
#!/bin/bash

read -p "Please enter your username:" username
grep -w $username /etc/passwd &> /dev/null

if [ $? -eq 0 ];then
	echo "$username is live!"
else
	echo "$username is none!"
fi
  1. 判断当前内核主版本是否为3,且次版本是否大于10
[root@localhost shell]# cat kernel.sh 
#!/bin/bash

aaa=`uname -r | cut -d "." -f 1`
bbb=`uname -r | cut -d "." -f 2`

if [ $aaa -eq 4 ];then 
	echo "主版本为4"
else
	echo "主版本不为4"
fi

if [ $bbb -ge 10 ];then
	echo "次版本大于10"
else
	echo "次版本小于10"
fi
  1. 判断某个软件软件包是否已经安装,如果没有则设置自动安装(需要yum源支持)
[root@localhost shell]# cat service.sh
#!/bin/bash

read -p "Please enter your check service:" Service

Service_num=`rpm -qa $Service | wc -l`

if [ $Service_num -eq 0 ];then
	echo "This Service is not install" && yum install -y $Service
	exit 2
else
	echo "This Service is install" && rpm -qa $Service | cut -d "-" -f 2
	exit 3
fi
  1. 判断某个服务是否运行,若是没有运行,则自动开启该服务,并进行回显;
[root@localhost shell]# cat service_2.sh
#!/bin/bash

read -p "Please enter your check service:" Service

while true
do
	Service_num=`ps -ef | grep $Service | wc -l`
	if [ $Service_num -gt 1 ];then
		echo "The service is running " &> /dev/null
	else
		echo "The service is not running"  && systemctl start #$Service
		break
	fi
done
  1. 判断指定的主机是否能ping通,必须使用$1变量
[root@localhost shell]# cat a1.sh 
#!/bin/bash

ping -c 1 $1 &> /dev/null

if [ $? -eq 0 ];then
	echo "this ip is ok!"
else
	echo "this ip is not ok!"
fi

[root@localhost shell]# sh a1.sh 192.168.1.1
this ip is ok!
  1. 判断用户输入的是否是数字,若不是数字,则重复输入;
[root@localhost shell]# cat input_num.sh
#!/bin/bash

while true
do
	read -p "Please enter your info:" info_file

	case "$info_file" in
		[0-9])
			echo "is number!" && break
			;;
		*)
			echo "is not number"
	esac
done

以上是关于Shell ❀ 条件判断语句的主要内容,如果未能解决你的问题,请参考以下文章

Shell ❀ 条件判断语句

Shell中的if和case判断语句

Shell中的if和case判断语句

shell编程之case分支语句

Linux Shell编程 条件判断语法

shell-条件测试语句_test