Shell编程之条件语句(if单分支、双分支、多分支、case多分支)

这篇博客详细介绍了Shell编程中的条件语句,包括整数值和字符串的比较、逻辑测试,以及if语句的单分支、双分支、多分支结构和case多分支语句的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.条件测试操作

test命令
	测试表达式是否成立,若成立返回0,否则返回其他数值
	格式1:test 条件表达式
	格式2:[ 条件表达式 ]			#前后有空格
文件测试
	[ 操作符 文件或目录 ]
常用的测试操作符
	-d:测试是否为目录(Directory)
	-e:测试目录或文件是否存在(Exist)
	-f:测试是否为文件(File)
	-r:测试当前用户是否有权限读取(Read)
	-w:测试当前用户是否有权限写入(Write)
	-x:测试当前用户是否有权限执行(excute)

举例:
[root@server media]# [ -d /media ]			#存在这个文件夹
[root@server media]# echo $?
0
[root@server ~]# [ -d /media/cdrom ]		#不存在这个文件夹
[root@server ~]# echo $?
1
[root@server ~]# [ -d /media ] && echo "abc"	#前面为真,则输出
abc
[root@server ~]# [ -d /media/cdrom ] || echo "abc"	#或者的意思,不管是否成立,都会输出
abc
[root@server ~]# echo $[!0]
1

整数值比较

整数值比较
	[ 整数1 操作符 整数2 ]
常用的测试操作符
	-eq:等于(Equal)
	-ne:不等于(Not Equal)
	-gt:大于(Greater Than)
	-lt:小于(Lesser Than)
	-le:小于或等于(Lesser or Equal)
	-ge:大于或等于(Greater or Equal)

常用的测试操作符
[root@server ~]# cat /etc/passwd | wc -l
44
[root@server ~]# [ $(cat /etc/passwd | wc -l) -gt 100 ] && echo "more than 100"
[root@server ~]# [ $(cat /etc/passwd | wc -l) -gt 10 ] && echo "more than 10"
more than 10

[root@server ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1823         294        1100           9         428        1322
Swap:          2047           0        2047
[root@server ~]# freecc=$(free -m | grep "Mem:" | awk '{print $6}')
[root@server ~]# [ $freecc -lt 1024 ] && echo "$freecc"MB
428MB

[root@server ~]# cat /etc/passwd | wc -l
44
[root@server ~]# [ $(cat /etc/passwd | wc -l) -gt 100 ] && echo "more than 100"
[root@server ~]# [ $(cat /etc/passwd | wc -l) -gt 10 ] && echo "more than 10"
more than 10

字符串比较

字符串比较
	格式1:[ 字符串1 = 字符串2 ]
		  [ 字符串1 != 字符串2 ]
	格式2:[ -z 字符串 ]
常用的测试操作符
	=:字符串内容相同
	!=:字符串内容不同,!号表示相反的意思
	-z:字符串内容为空

[root@server ~]# echo $LANG
zh_CN.UTF-8
[root@server ~]# [ $LANG != "en.US" ] && echo "not en.US"
not en.US
[root@server ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
[root@server ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖

逻辑测试

逻辑测试
	格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
	格式2:命令1 操作符 命令2 ...
常用的测试操作符
	-a或&&:逻辑与,“而且”的意思
	-o或||:逻辑或,“或者”的意思
	!:逻辑否
[root@server ~]# [ -d /etc ] && [ -r /etc ] && echo "You can"
You can
[root@server ~]# [ -d /etc ] || [ -d /home ] && echo "ok"
ok

2.if语句的结构

1.单分支结构

在这里插入图片描述

语句应用实例

单分支if语句

判断挂载点目录,若不存在则自动创建
[root@server ~]# cat chkmountdir.sh
#!/bin/bash
MOUNT_DIR="/media/cdrom"
if [ ! -d $MOUNT_DIR ]			#当目录不存在时执行
then mkdir -p $MOUNT_DIR
fi


[root@server ~]# vim weather.sh
if [ $weather = 'rainning' ]
 then echo "下雨了,记得打伞"
fi
[root@server ~]# read -p "今天天气怎么样" weather
今天天气怎么样rainning
[root@server ~]# export weather
[root@server ~]# sh weather.sh
下雨了,记得打伞

2.双分支语句

在这里插入图片描述

语句应用实例

双分支if语句

[root@server ~]# cat pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null		
if [ $? -eq 0 ]
 then echo "host $1 is up"
 else echo "host $1 is down"
fi
说明:"-c""-i""-W"选项,分别指定只发送三个测试包、间隔0.2秒、超时3秒
	判断ping命令的检查结果,分别给出不同的提示

[root@server ~]# sh pinghost.sh 192.168.100.11
host 192.168.100.11 is up
[root@server ~]# sh pinghost.sh 192.168.100.12
host 192.168.100.12 is down

实例2

[root@server ~]# cat weather.sh
if [ $weather = 'rainning' ]
 then echo "下雨了,记得打伞"
 else echo "好天气"
fi

[root@server ~]# read -p "今天天气怎样?" weather
今天天气怎样?cloud
[root@server ~]# sh weather.sh
好天气
[root@server ~]# read -p "今天天气怎样?" weather
今天天气怎样?rainning
[root@server ~]# sh weather.sh
下雨了,记得打伞

pgrep -x 服务和ps aux | grep 服务的区别:

pgrep -x 某服务名称,只获取该服务进程号
[root@server ~]# pgrep -x sshd
1146
99426

ps aux | grep 服务是查询该服务所有的相关信息,包含端口
[root@server ~]# ps aux | grep sshd
root       1146  0.0  0.0 105996   440 ?        Ss   13:21   0:00 /usr/sbin/sshd -D
root      99426  0.0  0.1 147784  5360 ?        Ss   18:05   0:00 sshd: root@pts/0
root     100418  0.0  0.0 112680   984 pts/0    S+   19:12   0:00 grep --color=auto sshd

3.多分支结构

在这里插入图片描述

语句应用实例

[root@server ~]# cat chengji.sh
#!/bin/bash
# get student's grade
read -p "输入考试成绩,范围0-100:" grade
if [ $grade -ge 90 ] && [ $grade -le 100 ]
    then echo "你得了$grade分,优秀"
elif [ $grade -ge 80 ] && [ $grade -lt 90 ]
    then echo "你得了$grade分,良好"
elif [ $grade -ge 60 ] && [ $grade -lt 80 ]
    then echo "你得了$grade分,及格"
elif [ $grade -ge 0 ] && [ $grade -lt 60 ]
    then echo "你得了$grade分,不及格"
else
    echo "输入错误,请重新输入"
fi

[root@server ~]# sh chengji.sh
输入考试成绩,范围0-100:80
你得了80分,良好

4.case多分支语句

在这里插入图片描述

case多分支语句

[root@server ~]# cat hitkey.sh
#!/bin/bash
read -p "请输入一个字符,并按enter键确认:" key
case "$key" in
[a-z]|[A-Z])
        echo "你输入的是字母"
        ;;
[0-9])
        echo "你输入的是数字"
        ;;
*)
        echo "你输入的是空格、功能键或其他控制字符"
esac

[root@server ~]# sh hitkey.sh
请输入一个字符,并按enter键确认:j
你输入的是字母

示例2

编写一个名为myprog的系统服务脚本,通过位置变量$1指定的start、stop、restart、status控制参数,分别用来启动、停止、重启、sleep进程的状态。其中sleep用来暂停指定秒数的时间,这里仅用做测试,在实际中应将sleep改为相应后台服务的控制命令序列

[root@server ~]# cat myprog
#!/bin/bash
case "$1" in
start)
    echo -n "正在启动服务..."
    if sleep 7200 &
    then
    echo "OK"
    fi
    ;;
stop)
    echo -n "正则停止sleep服务..."
    pkill "sleep" &> /dev/null
    echo "OK"
    ;;
status)
    if pgrep "sleep" &> /dev/null
    then echo "sleep服务已经启动"
    else echo "sleep服务已经停止"
    fi
    ;;
restart)
    $0 stop
    $0 start
    ;;
*)
    echo "用法:$0 {start|stop|status|restart}"
esac

[root@server ~]# sh myprog start
正在启动服务...OK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值