shell 条件语句

1、条件测试操作

1.1 文件测试 test、 [ ]、[[ ]]

要使Shell脚本程序具备一定的"智能",面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过 95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等

Shell 环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为 0 时表示成功,否则(非 0 值)表示失败或异常。使用专门的测试工具------test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为 0 表示条件成立)。

语法格式:

test 条件表达式

条件表达式 \] #中括号和表达式中间左右必须有空格 或 \[\[ 条件表达式 \]\] #\[\[ \]\]可去除特殊字符

文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否 可读、可写、可执行等。文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即可。
-d :测试是否为目录 (Directory)。
-e :测试目录或文件 是否存在(Exist)。
-f :测试是否为文件 (File)。
-r :测试当前用户是否有权限 取(Read)。
-w :测试当前用户是否有权限 入(Write)。
-x :测试是否设置有可执行 (Excute)权限。
-b :测试是否为设备文件
-c :测试是否为字符设备文件
-s :测试存在且文件大小为空
-L :测试是否为链接文件

执行条件测试操作以后,通过预定义变量?可以获得测试命令的返回状态值,从而判断该条件是否成立。例如,执行以下操作可测试目录/media/是否存在,如果返回值?为 0, 表示存在此目录,否则表示不存在或者虽然存在但不是目录

例1

root@localhost home\]# test -f /home/file // f 文件 \[root@localhost home\]# echo $? 0 \[root@localhost home\]# test -d /home/file // d 目录 \[root@localhost home\]# echo $? 1 \[root@localhost home\]# test -e /home/file // e 文件或目录 \[root@localhost home\]# echo $? 0

例2

root@localhost \~\]# \[ -f /home/file \] // 查看是否有/home/file 文件 \[root@localhost\~ \]# echo $? // 判断 0为有 非0为没有 0 \[root@localhost \~\]# \[ -d /home/yss \] \&\& echo "YES" // 有/home/yss,有的话输出YES YES \[root@localhost \~\]# \[ ! -e /home/kgc \] \&\& mkdir /home/kgc //没有/home/kgc的话, 创建

1.2 整数值比较 (-eq -ne -gt...)

整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数。整数值比较的常用操作选项如下,使用时将操作选项放在要 比较的两个整数之间。

常用测试操作符
-eq :等于(Equal)
-ne :不等于(Not Equal)
-gt :大于(Greater Than)
-lt :小于(Lesser Than)
-le :小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)

例1

root@localhost \~\]# who \|wc -l 4 \[root@localhost \~\]# \[ $(who\|wc -l) -lt 5 \] \&\& echo "用户太少" 用户太少 \[root@localhost \~\]# \[ $(who\|wc -l) -gt 10 \] \&\& echo "\>=10"

例2

root@localhost \~\]# FREE6=$(free -m \|grep Mem \|awk '{print $6}') 定义变量FREE6 过滤Mem 打印第6列 \[root@localhost \~\]# \[ $FREE6 -lt 4096 \] \&\& echo ${FREE6}MB 447MB 变量小于4096 输出 变量值MB \[root@localhost \~\]# FREE4=$(free -m \|grep "Mem:" \|awk '{print $4}') \[root@localhost \~\]# \[ $FREE4 -ge 2048 \] \&\& echo "内存不足,请尽快处理" "内存不足,请尽快处理"

1.3 字符串比较(= != -z)

字符串比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的Shell脚本中,也可用来判断用户输入的位置参数是否符合要求。字符串比较的常用操作选项如下。

= :第一个字符串与第二个字符串相同
!= :第一个字符串与第二个字符串不相同 ,其中"! "符号表示取反
-z :检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串。

例1,语言不是英文的话输出"not US"

root@localhost \~\]# echo $LANG zh_CN.UTF-8 \[root@localhost \~\]# \[ $LANG != en.US \] \&\& echo "not US" not US

例2,用户输入是否覆盖文件,如果是,输出"覆盖"

root@localhost \~\]# read -p "是否覆盖文件:" COVER 是否覆盖文件:yes \[root@localhost \~\]# \[ $COVER = yes \] \&\& echo "覆盖" 覆盖

例3,如果str是空字符的话,输出"空字符串"

root@localhost \~\]# str= \[root@localhost \~\]# \[ -z $str \] \&\& echo "覆盖" 覆盖

1.4 逻辑测试(&& -a || -o !)

逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或者只要有其中一个成立等情况,需要有一个测试的过程。

常用的逻辑测试操作如下,使用时放在不同的测试语句或命令之间。

&&逻辑与 ,表示"而且 ",只有当前后两个条件都成立 时,整个测试命令的返回值才为 0 (结果成立)。使用 test命令测试时,"&&"可改为"-a"

\] \&\& \[ \] \&\& echo " " \[ A -a B \] -a 而且 **\|\|**:**逻辑或** ,表示"**或者** ",只要前后**两个条件中有一个成立** ,整个测试命令的**返回值即为 0** (结果成立)。使用 test 命令测试时,**"\|\|"可改为"-o"**。 \[ \] \|\| \[ \] \&\& echo " " \[ A -o B \] -o 或 **!**:**逻辑否** ,表示"**不** ",只有当指定的条件**不成立** 时,整个测试命令的**返回值才为 0**(结果成立)。 > 例1,①有目录/etc/ 而且 /etc有读权限 ,输出"ok" > > \[root@localhost \~\]# \[ -d /etc \] \&\& \[ -r /etc \] \&\& echo "ok" > > ok > > \[root@localhost \~\]# \[ -d /etc -a -x /etc \] \&\& echo "ok" > > ok > > \[root@localhost \~\]# echo $? > > 0 > > ② 有目录/etc 而且 /home/file有执行权限 ,输出"ok" > > \[root@localhost \~\]# \[ -d /etc \] \&\& \[ -x /home/file \] \&\& echo "ok" // 结果错不输出 > > \[root@localhost \~\]# \[ -d /etc -a -x /home/file \] \&\& echo "ok" > > \[root@localhost \~\]# echo $? > > 1 > > ③ 有目录/etc 或 /home/file有执行权限 ,输出"ok" > > \[root@localhost \~\]# \[ -d /etc \] \|\| \[ -x /home/file \] \&\& echo "ok" > > ok > > \[root@localhost \~\]# \[ -d /etc -o -x /home/file \] \&\& echo "ok" > > ok ![](https://i-blog.csdnimg.cn/direct/900c2d127baa486d987fe44de2721856.png) ![](https://i-blog.csdnimg.cn/direct/86b3b9e79b704bd886d22379a4ba4370.png) 在上述逻辑测试的操作选项中,"\&\&"和"\|\|"通常也用于间隔不同的命令操作,其作用是相似的。实际上此前已经接触过"\&\&"操作的应用,如"make \&\& make install"的编译安装操作。 例如,若要判断当前 Linux 系统的内核版本是否大于 3.4,可以执行以下操作。其中, 内核版本号通过 uname 和 awk 命令获得 > 例2,定义变量NUM1、NUM2 ,NUM1大于等于3 而且 NUM2大于4 ,输出"符合要求" > > \[root@localhost \~\]# uname -r //查看内核版本信息 > > 3.10.0-693.el7.x86_64 > > \[root@localhost \~\]# NUM1=$(uname -r\| awk -F. '{print $1}') //定义主版本号 > > \[root@localhost \~\]# NUM2=$(uname -r\| awk -F. '{print $2}') //定义次版本号 > > \[root@localhost \~\]# \[ $NUM1 -ge 3 \] \&\& \[ $NUM2 -gt 4 \] \&\& echo "符合要求" > > 符合要求 > > \[root@localhost \~\]# \[ "$NUM1" -ge 3 -a "$NUM2" -gt 4 \] \&\& echo "符合要求" > > 符合要求 ![](https://i-blog.csdnimg.cn/direct/16490ced72bb452ab3ba2172979b1782.png) ![](https://i-blog.csdnimg.cn/direct/be11798add824345a4399b8811ec8c21.png) ## 2、 if语句的结构(\[ \] \[\[ \]\]使用方法) 单个括号 \[ \]:必须要有空格 两个字符或数字之间的比较左右必须有空格 条件判断:test一种形式,\[ \]中间只能使用 = 和 != 比较字符串 ,如果使用 \< 、\>需要进行转义\\. 中间如果比较数字要用 -lt 等符号, 不能使用\\\<比较数字,他会当成字符串处理 两个括号 \[\[ \]\]:可用于处理逻辑命令,也可以处理字符串是否相等,且使用 \< 、\>不用转义符 \[\[ 表达式 \]\] : 可以去除特殊符号 当使用 **==** 和 **!=**操作符时,操作符右边的字符串被用作模式并且执行一个匹配。 当使用 **=\~** 操作符时,操作符右边的字符串被当作正则表达式来进行匹配。 > 举例 > > if \[\[ $FILE == \*.sh \]\] # \* 为特殊符号 **if语句 定义变量尽量大写** ## 2、单分支 if 语句 实际上使用"\&\&"和"\|\|"逻辑测试已经可以完成简单的判断并执行相应的操作,但是当需要选择执行的命令语句较多时,这种方式将使执行代码显得很复杂,不好理解。而使用专用的 if 条件语句,可以更好地整理脚本结构,使得层次分明, 清晰易懂 > **语法格式:** > > **①** > **if 条件测试操作 > then > 命令序列 > fi #注意后面有个结尾,开头结尾要凑成一对否则会报语法错误** > > **②** > > **if 条件测试操作;then > 命令序列 > fi** 单分支 if 语句:对于单分支的选择结构,**只有在"条件成立"时才会执行相应的代码,否则不执行任何操作。** > 例1,3大于2,输出"ok" > > \[root@localhost \~\]# \[ 3 -gt 2 \] \&\& echo "ok" > > ok > > 或 > > \[root@localhost \~\]# vim demo1.sh > > #!/bin/bash > > #需求: 3 大于 2 , 输出 "ok" > > if \[ 3 -gt 2

then

echo "ok"

fi

root@localhost \~\]# chmod +x demo1.sh \[root@localhost \~\]# ./demo1.sh ok

例2, 判断目录是否存在

root@localhost \~\]# vim demo2.sh #!/bin/bash #需求:判断目录/mnt是否存在,若存在,输出"存在" if ls /mnt then echo "存在" fi \[root@localhost \~\]# chmod +x demo2.sh \[root@localhost \~\]# ./demo2.sh 存在

例2,判断挂载点,如果不存在就自动创建

root@localhost \~\]# vim demo3.sh #!/bin/bash # 需求:判断挂载点,如果不存在就自动创建 #1、定义挂载目录变量 MOUNT="/media/cdrom" #2、如果挂载点不存在,自动创建 if \[ ! -d /media/ccdrom

then

mkdir -p /media/cdrom

fi

root@localhost \~\]# chmod +x demo3.sh \[root@localhost \~\]# ./demo3.sh

例3 判断输入结尾是否.sh

root@localhost if\]# vim demo4.sh #!/bin/bash #需求:判断输入结尾是否 .sh #1、定义输入变量 read -p "请输入文件" FILE #2、输入是 .sh 结尾,输出"这是一个shell脚本" if \[\[ $FILE == \*.sh \]\] // \[\[ \]\] 可以去除特殊字符 then echo "这是一个shell脚本" fi \[root@localhost if\]# chmod +x demo4.sh \[root@localhost if\]# ./demo4.sh 请输入文件a.sh 这是一个shell脚本

例4,磁盘根目录使用超过80%,输出"内存占用过大"

root@localhost \~\]# vim MOST.sh #!/bin/bash # 需求:/目录使用超过80%,输出"内存占用过大" #1、定义变量 /目录使用百分比 MOST MOST=$(df -Th \| grep "/$" \| awk '{print $6}') #移除百分比符合(%) MOST=${MOST%?} #2、判断/目录使用有没有超过80%,如果超过,输出"内存占用过大" if \[ $MOST -ge 80%

then

echo "内存占用过大"

fi

root@localhost \~\]# chmod +x MOST.sh \[root@localhost \~\]# ./MOST.sh

3、双分支 if 语句

双分支 if 语句只是在单分支的基础上针对"条件不成立"的情况执行另一种操作,而不是 "坐视不管"地不执行任何操作

格式:

if 条件测试操作
then 命令序列 1

else

then 命令序列 2
fi

-c ping的次数

-i 每次多久ping一次,单位是秒

-W 反馈结果的时间,如果不通时可加快反馈时间,单位是秒

例1, 判断目标主机是否存活,存活就打印 ip is up,如果不存活就打印 ip is down

root@localhost if\]# vim demo5.sh #!/bin/bash #需求:判断主机是否存活,存活输出 is up ,不存活输出 is down #1、定义主机IP变量,ping IP IP=(192.168.190.10) ping -c 3 -i 1 -W 3 $IP \&\> /dev/null #2、主机能ping通,输出ip is up,不能ping通,输出ip is down if \[ $? = 0

then

echo "ip is up"

else

echo "ip is down"

fi

root@localhost if\]# sh demo5.sh ip is up

判断以.sh结尾的脚本是一个shell脚本(双方括号用法:可以模式匹配)

abc == abc

[[ abc == abc* ]]

例2.判断输入的用户名是否存在,存在提示已存在,不存在则创建用户并设置密码

root@localhost if\]# vim demo6.sh #!/bin/bash # 需求:判断输入的用户名是否存在,存在提示已存在,不存在创建用户并设置密码 #1、定义用户名变量 read -p "请输入用户名" NAME id $NAME \&\> /dev/null # 2、判断输入的用户名是否存在,存在提示已存在,不存在创建用户并设置密码 if \[ $? -eq 0

then

echo "用户名已存在"

else

echo "123" | passwd --stdin $NAME &>/dev/null

echo "已创建用户$NAME,密码为123"

fi

root@localhost if\]# sh demo6.sh 请输入用户名yss 用户名已存在 \[root@localhost if\]# sh demo6.sh 请输入用户名lisi 已创建用户lisi,密码为123

例3.判断当前登陆用户是否是管理员

root@localhost if\]# vim demo7.sh #!/bin/bash #需求:判断当前登录用户是否是管理员 UID=0 if \[ $UID -eq 0

then

echo "当前用户是管理员"

else

echo "当前用户不是管理员"

fi

root@localhost if\]# sh demo7.sh 当前用户是管理员

例4,检查用户输入目录是否存在

root@localhost if\]# vim demo8.sh #!/bin/bash #需求:检查用户输入目录是否存在 #1、定义输入目录变量 read -p "请输入目录" NAME ls $NAME \&\> /dev/null #2、如何目录存在,输出"目录存在",如果目录不存在,输出"请输入正确路径" if \[ $? -eq 0 \] \&\> /dev/null then echo "目录存在" else echo "请输入正确路径" fi \[root@localhost if\]# sh demo8.sh 请输入目录/opt/a 请输入正确路径 \[root@localhost if\]# sh demo8.sh 请输入目录/opt 目录存在

例5,查看http(80端口)是否运行

root@localhost if\]# vim demo9.sh#!/bin/bash #需求:查看http(80端口)是否运行 #1、查看80端口是否开启 netstat -napt \| grep ":80" \&\> /dev/null #2、如果开启,输出"服务已运行",如果没开启,开启服务,并输出"已启动服务" if \[ $? = 0

then

echo "服务已开启"

else

echo "已开启服务..........................................."

yum install httpd -y &> /dev/null

systemctl start httpd &> /dev/null

fi

root@localhost if\]# sh demo9.sh "已开启服务..........................................." \[root@localhost if\]# sh demo9.sh 服务已开启

4、多分支if语句

与单分支、双分支 if 语句相比,多分支 if 语句的结构能够根据多个互斥的条件分别执行不同的操作

格式:

if 条件测试操作1

then 命令序列1

elif 条件测试操作2

then 命令序列2

else

命令序列3

fi

案例:

例1.根据输入的考试分数不同来区分优秀、合格、不合格三挡

root@localhost if\]# vim demo10.sh #!/bin/bash #需求:根据输入的考试分数,区分优秀、合格、不合格 #1、定义输入分数 变量 read -p "请输入分数" GRADE #2、100-80优秀 79-60中等 59-0不合格 if \[ $GRADE -le 100 \] \&\& \[ $GRADE -ge 80 \];then echo "$GRADE分,优秀" elif \[ $GRADE -lt 80 \] \&\& \[ $GRADE -ge 60 \];then echo "$GRADE分,中等" else echo "$GRADE分,不及格" fi \[root@localhost if\]# sh demo10.sh 请输入分数100 100分,优秀 \[root@localhost if\]# sh demo10.sh 请输入分数67 67分,中等 \[root@localhost if\]# sh demo10.sh 请输入分数22 22分,不及格

例2.判断文件类别#!/bin/bash

root@localhost if\]# vim demo11.sh #需求:判断文件类型 #1、定义文件变量 FILE=/etc #2、-d目录、-f文件、-b设备文件、-c字符设备文件、-L链接文件 if \[ -d $FILE \];then echo "这是一个目录" elif \[ -f $FILE \];then echo "这是一个目录" elif \[ -b $FILE \];then echo "这是一个设备文件" elif \[ -c $FILE \];then echo "这是一个字符设备文件" elif \[ -L $FILE \];then echo "这是一个链接文件" else echo "无法判断类型" fi \[root@localhost if\]# sh demo11.sh 这是一个目录

root@localhost if\]# vim demo12.sh #!/bin/bash #需求:输入分数,100分不抄,100-80抄10遍,80-60抄20遍,60以下全抄30变 #1、定义分数变量 read -p "请输入分数(0-100):" GRADE #2、100分不抄,100-80抄10遍,80-60抄20遍,60以下全抄30变 if \[ $GRADE -eq 100 \];then echo "哇偶100分" elif \[ $GRADE -lt 100 \] \&\& \[ $GRADE -ge 80 \];then echo "$GRADE分,抄10遍" elif \[ $GRADE -lt 80 \] \&\& \[ $GRADE -ge 60 \];then echo "$GRADE分,抄20遍" elif \[ $GRADE -lt 60 \] \&\& \[ $GRADE -ge 0 \];then echo "$GRADE分,全抄30遍,洗洗睡吧" else echo "输入错误,请在0-100内输入分数" fi \[root@localhost if\]# sh demo12.sh 请输入分数(0-100):100 哇偶100分 \[root@localhost if\]# sh demo12.sh 请输入分数(0-100):89 89分,抄10遍 \[root@localhost if\]# sh demo12.sh 请输入分数(0-100):3899 输入错误,请在0-100内输入分数

5、嵌套if语句

set -x 加在脚本里能看到运行过程

例1.判断httpd服务有没有启动

if 判断是否启动

if 如果启动------输出已启动

如果没启动----判断是否安装---如果安装---启动

如果没安装----安装---如果安装成功---启动

如果安装不成功-----报错

#!/bin/bash

#需求:判断httpd是否启动

#httpd已启动 ,输出"httpd服务已启动" ($? -eq 0)

httpd未启动 ,如果已安装,启动服务,输出"正在启动服务" ($? -ne 0)

如果未安装,安装并启动服务,输出"正在启动服务"

安装失败,输出"启动失败"

ps -aux | grep httpd | grep -v grep

if [ $? -eq 0 ];then

ecoh "httpd服务已启动"

else

if [ "$(rpm -q httpd)" == "httpd-2.4.6-99.el7.centos.1.x86_64" ];then

systemctl start httpd &> /dev/null

echo "正在启动服务............................................"

elif [ "$(rpm -q httpd)" == "未安装软件包 httpd " ];then

yum install httpd -y &> /dev/null

systemctl start httpd &> /dev/null

echo "正在启动服务............................................."

else

echo "启动失败,请检查其他错误"

fi

fi

root@localhost if\]# sh demo13.sh httpd服务已启动 \[root@localhost if\]# sh demo13.sh 正在启动服务............................................

例2.判断是否有用户 判断一个用户是否有家目录,有打印正常,没有询问是否需要删除,如果是就删除

判断系统有无此用户----有---判断有无家目录----有----输出正常的用户

无----询问是否删除此用户------是----删除

否----退出脚本

无----提示没有此用户

vim demo14.sh

#!/bin/bash

#需求:查看系统用户

有用户,有家目录

无家目录,输出"是否删除用户"

无用户,有家目录,输出"是否删除家目录"

read -p "请输入用户名:" USER

tail /etc/passwd | grep $USER &> /dev/null

if [ $? -eq 0 ];then

ls /home/$USER &> /dev/null

if [ $? -eq 0 ];then

echo "$USER有用户有家目录"

else

read -p "$USER无家目录,是否删除用户(yes/no):" ACK

if [ $ACK = yes ];then

echo "正在删除用户........................................"

userdel $USER

elif [ $ACK = no ];then

exit

else

echo "输入错误,请输入yes/no"

fi

fi

else

echo "$USER不存在"

fi

root@localhost if\]# sh demo14.sh 请输入用户名:yss yss有用户有家目录 \[root@localhost if\]# sh demo14.sh 请输入用户名:wangwu wangwu无家目录,是否删除用户(yes/no):no \[root@localhost if\]# sh demo14.sh 请输入用户名:wangwu wangwu无家目录,是否删除用户(yes/no):yes 正在删除用户........................................ \[root@localhost if\]# sh demo14.sh 请输入用户名:abcd abcd不存在

6、case语句

case 语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写

case 语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个 不同的条件,而 case 语句只是判断一个变量的不同取值

格式:

case 变量值 in

模式 1)

命令序列 1

;;

模式 2)

命令序列 1

;;

* )

默认命令序列

esac

case 行尾必须为单词"in",每一模式必须以右括号")"结束。

双分号";;"表示命令序列的结束。

模式字符串中,可以用方括号表示一个连续的范围,如[0-9]表示0-9[! 0-9]表示非0-9;*[0-9]*表示变量两边是数字,(1swh4)

竖杠符号 "|"表示或,如"A|B"

"*)"表示默认模式,其中的*相当于通配符,表示所有其它的可能

case 语句的执行流程:首先使用"变量值"与模式 1 进行比较,若取值相同则执行模式 1 后的命令序列,直到遇见双分号";;"后跳转至 esac,表示结束分支;若与模式 1 不相匹配, 则继续与模式 2 进行比较,若取值相同则执行模式 2 后的命令序列,直到遇见双分号";;"后 跳转至 esac,表示结束分支......依此类推,若找不到任何匹配的值,则执行默认模式"*)" 后的命令序列,直到遇见 esac 后结束分支

案例:今天吃什么?一周七天不重样

root@localhost case\]# vim case1.sh #!/bin/bash #需求:今天吃什么,一周七天不重样 DAY=$(date +%w) case $DAY in 1) echo "周一蒸花鸭" ;; 2) echo "周二蒸熊掌" ;; 3) echo "周三烧花鸭" ;; 4) echo "周四烧子鹅" ;; 5) echo "周五蒸鹿邑" ;; 6) echo "周六松花小肚" ;; 0) #date +%w 现在周一到周日分别为 1234560 echo "周七晾肉香肠" ;; \*) echo "输入错误,请输入1-7" esac \[root@localhost case\]# sh case1.sh 周六松花小肚 \[root@localhost case\]# date -s "20240721" 2024年 07月 21日 星期日 00:00:00 CST \[root@localhost case\]# sh case1.sh 周七晾肉香肠 \[root@localhost case\]# date -s "20240719" 2024年 07月 19日 星期五 00:00:00 CST \[root@localhost case\]# sh case1.sh 周五蒸鹿邑

典型案例:检查用户输入的字符类型

root@localhost case\]# vim case2.sh #!/bin/bash #需求:检查用户输入的字符类型 read -p "请输入字符:" A case $A in \[a-z\]\|\[A-Z\]) echo "输入的是字母" ;; \[0-9\]) echo "输入的是字母" ;; \*) echo "输入的是空格或字符" esac \[root@localhost case\]# sh case2.sh 请输入字符:a 输入的是字母 \[root@localhost case\]# sh case2.sh 请输入字符:3 输入的是字母 \[root@localhost case\]# sh case2.sh 请输入字符: 输入的是空格或字符

例,用户输入分数,100分不抄,99-80抄10遍,79-60抄20遍,60以下抄30遍

#!/bin/bash

#需求:用户输入分数,100分不抄,99-80抄10遍,79-60抄20遍,60以下抄30遍

#定义分数变量

read -p "请输入分数0-100:" GRADE

$GRADE -eq 100 \] \&\& a=0 \[ $GRADE -lt 100 \] \&\& \[ $GRADE -ge 80 \] \&\& a=1 \[ $GRADE -lt 80 \] \&\& \[ $GRADE -ge 60 \] \&\& a=2 \[ $GRADE -lt 60 \] \&\& \[ $GRADE -ge 0 \] \&\& a=3 #case语句,100分不抄,99-80抄10遍,79-60抄20遍,60以下抄30遍 case $a in 0) echo "100分,不用抄" ;; 1) echo "抄10遍" ;; 2) echo "抄20遍" ;; 3) echo "抄30遍" ;; \*) echo "输入错误,请输入0-100" esac ② #!/bin/bash #需求:用户输入分数,100分不抄,99-80抄10遍,79-60抄20遍,60以下抄30遍 #定义分数变量 read -p "请输入分数(0-100):" GRADE case $GRADE in 100) echo "$GRADE分,哇哦,amazing" ;; \[8-9\]\[0-9\]) echo "$GRADE分,抄10遍" ;; \[6-7\]\[0-9\]) echo "$GRADE抄20遍" ;; \[0-6\]\[0-9\]\|\[0-9\]) echo "$GRADE抄30遍" ;; \*) echo "输入错误,请输入0-100" esac

通常使用httpd服务名,可以使用以下命令来启动Apache服务

例,编写 apache 启动服务脚本

#!/bin/bash

#需求:编辑apache服务启动脚本

#定义start/stop/trstart/status变量(systemctl $a httpd)

read -p "请输入对httpd的操作start/stop/restart/status:" a

#case 语句输入start/stop/trstart/status

case $a in

start)

systemctl $a httpd

ps -aux|grep httpd|grep -v grep

echo "start httpd"

;;

stop)

systemctl $a httpd

echo "httpd $a"

ps -aux|grep httpd|grep -v grep

;;

restart)

systemctl $a httpd

ps -aux|grep httpd|grep -v grep

echo "httpd $a"

;;

status)

systemctl $a httpd

ps -aux|grep httpd|grep -v grep

echo "httpd $a"

;;

*)

echo "输入错误,请输入start/stop/restart/status"

esac

例,石头剪刀布

#!/bin/bash

#需求:石头剪刀布游戏

#定义 出石头、剪刀、布 变量

echo "1=石头"

echo "2=剪刀"

echo "3=布"

read -p "请输入你要出的(1/2/3)" a

b=$[ RANDOM%3 ]

#0=石头 1=剪刀 2=布

case $a in

if [ $b=0 ];then

echo "石头,平局"

elif [ $b=1 ];then

echo "剪刀,你赢了"

else

echo "布,你输了"

fi

;;

if [ $b=0 ];then

echo "石头,你输了"

elif [ $b=1 ];then

echo "剪刀,平局"

else

echo "布,你赢了"

fi

;;

if [ $b=0 ];then

echo "石头,你赢了"

elif [ $b=1 ];then

echo "剪刀,你输了"

else

echo "布,平局"

fi

;;

esac

相关推荐
dingdingfish2 天前
GNU Parallel 学习 - 第1章:How to read this book
bash·shell·gnu·parallel
似霰5 天前
Linux Shell 脚本编程——核心基础语法
linux·shell
似霰6 天前
Linux Shell 脚本编程——脚本自动化基础
linux·自动化·shell
偷学技术的梁胖胖yo7 天前
Shell脚本中连接数据库查询数据报错 “No such file or directory“以及函数传参数组
linux·mysql·shell
纵有疾風起16 天前
【Linux 系统开发】基础开发工具详解:软件包管理器、编辑器。编译器开发实战
linux·服务器·开发语言·经验分享·bash·shell
gis分享者18 天前
Shell 脚本中如何使用 here document 实现多行文本输入? (中等)
shell·脚本·document·多行·文本输入·here
柏木乃一18 天前
基础IO(上)
linux·服务器·c语言·c++·shell
angushine18 天前
CPU脚本并远程部署
shell
赵民勇23 天前
Linux/Unix中install命令全面用法解析
linux·shell
gis分享者24 天前
Shell 脚本中如何使用 trap 命令捕捉和处理信号(中等)
shell·脚本·信号·处理·trap·捕捉