shell脚本第二章条件语句

目录

一、条件语句

1.test命令

1.1延伸 [ ] 和 [[ ]]

2.比较整数数值大小

 3.字符串比较

4.逻辑测试(短路运算)

4.1且——&& 或 -a

4.2或——|| 或 -o

5.延伸

5.1 且 或 的用法

5.2磁盘剩余量告警小实验

5.3验证网络是否通畅

5.4双中括号 [[ ]]

二、if语句

2.if语句的结构

2.1单分支

 2.2双分支

 2.2.1嵌套

2.3多分支

​编辑

 2.3.1判断操作系统安装httpd服务 

2.3.2判断分数级别

2.3.3包剪锤

2.3.4鸡兔同笼

2.3.5删除无用的账户信息

三、case语句

1.定义

2.格式

3.case语句结构

​编辑4.case实验 

4.1判断数字字母

4.2判断yes/no

4.3小小工具箱

4.4成绩分数等第

4.5包剪锤

4.6跳板机

4.7点菜


引言

直叙:按顺序执行  1  2  3  4  5

判断:条件判断  根据条件不同,执行不同任务

一、条件语句

1.test命令

含义:测试表达式是否成立,若成立返回0,否则返回其他值

判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成

格式1:test 条件表达式

格式2:[ 条件表达式 ]

[ 操作符 文件或目录 ]   注意前后空格

[root@localhost ~]#type test
test 是 shell 内嵌
[root@localhost ~]#help test
test: test [表达式]
    Evaluate conditional expression.
    
    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  Unary
    expressions are often used to examine the status of a file.  There
    are string operators and numeric comparison operators as well.
    
    The behavior of test depends on the number of arguments.  Read the
    bash manual page for the complete specification.
    
    File operators:
    
      -a FILE        True if file exists.
           #测试目录或文件是否存在(Exist)
      -b FILE        True if file is block special.
      -c FILE        True if file is character special.
      -d FILE        True if file is a directory.
           #测试是否为目录(Directory)
      -e FILE        True if file exists.
           #测试目录或文件是否存在(Exist)
      -f FILE        True if file exists and is a regular file.
           #测试是否为文件(File)
      -g FILE        True if file is set-group-id.
      -h FILE        True if file is a symbolic link.
      -L FILE        True if file is a symbolic link.
           #测试是否为软连接文件
      -k FILE        True if file has its `sticky' bit set.
      -p FILE        True if file is a named pipe.
      -r FILE        True if file is readable by you.
           #测试当前用户是否有权限读取(Read)
      -s FILE        True if file exists and is not empty.
           #是否存在且非空
      -S FILE        True if file is a socket.
      -t FD          True if FD is opened on a terminal.
           #fd 文件描述符是否在某终端已经打开
      -u FILE        True if the file is set-user-id.
      -w FILE        True if the file is writable by you.
           #测试当前用户是否有权限写入(Write)
      -x FILE        True if the file is executable by you.
           #测试当前用户是否有权限执行(eXcute)
      -O FILE        True if the file is effectively owned by you.
           #当前有效用户是否为文件属主
      -G FILE        True if the file is effectively owned by your group.
           #当前有效用户是否为文件属组
      -N FILE        True if the file has been modified since it was last read.
           #文件自从上一次被读取之后是否被修改过
    
      FILE1 -nt FILE2  True if file1 is newer than file2 (according to
                       modification date).
    
      FILE1 -ot FILE2  True if file1 is older than file2.
    
      FILE1 -ef FILE2  True if file1 is a hard link to file2.
    
    String operators:
    
      -z STRING      True if string is empty.
    
      -n STRING
         STRING      True if string is not empty.
    
      STRING1 = STRING2
                     True if the strings are equal.
      STRING1 != STRING2
                     True if the strings are not equal.
      STRING1 < STRING2
                     True if STRING1 sorts before STRING2 lexicographically.
      STRING1 > STRING2
                     True if STRING1 sorts after STRING2 lexicographically.
    
    Other operators:
    
      -o OPTION      True if the shell option OPTION is enabled.
      -v VAR	 True if the shell variable VAR is set
      ! EXPR         True if expr is false.
      EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.
      EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.
    
      arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,
                     -lt, -le, -gt, or -ge.
    
    Arithmetic binary operators return true if ARG1 is equal, not-equal,
    less-than, less-than-or-equal, greater-than, or greater-than-or-equal
    than ARG2.
    
    Exit Status:
    Returns success if EXPR evaluates to true; fails if EXPR evaluates to
    false or an invalid argument is given.
[root@localhost ~]#test -a /etc/passwd;echo $?
0
[root@localhost ~]#test -a /etc/xxxxxx;echo $?
1
 
[root@localhost ~]#test -e /etc/passwd;echo $?
0
[root@localhost ~]#test -e /etc/xxxxx;echo $?
1
 
[root@localhost ~]#[ -d /etc/sysconfig/ ];echo $?
0
[root@localhost ~]#[ -f /etc/sysconfig/ ];echo $?
1
 
 
 
若真,则状态码变量 $? 返回0
 
若假,则状态码变量 $? 返回1
 

 [  ]  是test的同义词   建议使用 [  ]

1.1延伸 [ ] 和 [[ ]]

shell脚本第二章条件语句_第1张图片

[root@localhost ~]#[ -d /etc/passwd ];echo $?
1
[root@localhost ~]#[ -d /etc/sysconfig/ ];echo $?
0
 
 
[root@localhost ~]#[[ -d /etc/sysconfig ]];echo $?
0
[root@localhost ~]#[[ -d /etc/sysconfig/* ]];echo $?
1
 
 
[root@localhost ~]#[ -e /etc/passwd ];echo $?
0
[root@localhost ~]#[ -e /etc/pas ];echo $?
1
#判断文件是否存在

[[ ]]支持正则表达式 

2.比较整数数值大小

[ 整数1 -操作符 整数2 ] 公式

  • -eq:第一个数等于(Equal)第二个数
  • -ne:第一个数不等于(Not Equal)第二个数
  • -gt:第一个数大于(Greater Than)第二个数
  • -lt:第一个数小于(Lesser Than)第二个数
  • -le:第一个数小于或等于(Lesser or Equal)第二个数
  • -ge:第一个数大于或等于(Greater or Equal)第二个数
[root@localhost ~]#a=2
[root@localhost ~]#b=6
[root@localhost ~]#[ $a -eq $b ];echo $?
1
[root@localhost ~]#[ $a -ne $b ];echo $?
0
[root@localhost ~]#[ $a -gt $b ];echo $?
1
[root@localhost ~]#[ $a -lt $b ];echo $?
0
[root@localhost ~]#[ $a -le $b ];echo $?
0
[root@localhost ~]#[ $a -ge $b ];echo $?
1

 3.字符串比较

常用的测试操作符

  • =:字符串内容相同
  • !=:字符串内容不同,! 号表示相反的意思
  • -z:字符串内容为空
  • -n: 字符是否存在

格式

  • [ 字符串1 = 字符串2 ] 是否相同
  • [ 字符串1 != 字符串2 ] 是否不相同
  • [ -z 字符串 ] 是否为空
  • [ -n 字符串 ] 字符是否存在
[root@localhost ~]#str1=wsc
[root@localhost ~]#str2=wyq
[root@localhost ~]#[ $str1 = $str2 ];echo $?
1
[root@localhost ~]#[ $str1 != $str2 ];echo $?
0
[root@localhost ~]#[ -z /etc/passwd ];echo $?
1
[root@localhost ~]#[ -z /opt/rh/ ];echo $?
1
[root@localhost ~]#[ -n /opt/rh/ ];echo $?
0
[root@localhost ~]#[ -n /etc/passwd ];echo $?
0
[root@localhost ~]#str=
[root@localhost ~]#[ -z $str ];echo $?
0
[root@localhost ~]#str=" "
[root@localhost ~]#[ -z $str ];echo $?
0
[root@localhost ~]#[ -n $str ];echo $?
0
 
 
[root@localhost ~]#[ $USER = root ]&& echo true
true
 
[root@localhost ~]#read -p "yes/no:" ack;echo ack
yes/no:yes
ack
[root@localhost ~]#read -p "yes/no:" ack;echo ack
yes/no:no
ack
[root@localhost ~]#read -p "yes/no:" ack;echo ack
yes/no:y
ack
[root@localhost ~]#read -p "yes/no:" ack;echo ack
yes/no:1
ack

4.逻辑测试(短路运算)

格式1:[ 表达式1 ]  操作符  [ 表达式2 ]

格式2:命令1  操作符  命令2

常见条件

  • -a或&&:逻辑与,“而且”的意思全真才为真
  • -o或||:逻辑或,“或者”的意思一真即为真
  • !:逻辑否
4.1且——&& 或 -a

shell脚本第二章条件语句_第2张图片

cmd1 && cmd2  如果cmd1 为假,那么没有必要执行cmd2,其结果一定为假;

cmd1 成立 cmd2成立 则最终结果成立。

全真才真  一假即假

4.2或——|| 或 -o

shell脚本第二章条件语句_第3张图片

 cmd1 || cmd2 如果cmd1 或 cmd2 有一个是真的,那么最后结果为真;

全假才假 一真即真

5.延伸

下面哪种写法表示如果cmd1成功执行,则执行cmd2命令

A.cmd1&&cmd2  B.cmd1|cmd2  C.cmd1;cmd2  D.cmd1||cmd2

解析:答案为A;B选项是因为cmd1或cmd2,只输出一个;C选项因为cmd1无论是否执行,还是会执行cmd2;D选项是因为如果cmd1为真为假都会执行cmd2

5.1 且 或 的用法
[root@localhost ~]#whoami
root
[root@localhost ~]#[ `whoami` = root ]&& echo "true"
true
[root@localhost ~]#[ `whoami` = ghd ]&& echo "true"
[root@localhost ~]#[ `whoami` = ghd ]&& echo "true"|| echo "false"
false

 cmd1 && cmd2 || cmd3  =  (cmd1 && cmd2) || cmd3

如果cmd1为真,才会执行cmd2,整个式子一定为真,就不需要执行cmd3

如果cmd1为假,那么不会执行cmd2,整个式子(cmd1 && cmd2)为假,然后需要执行cmd3来判断

5.2磁盘剩余量告警小实验
[root@localhost ~]#df|tr -s " "|grep sda|cut -d " " -f5|tr -d %
4
[root@localhost ~]#vim scandisk.sh
 
#!/bin/bash
use=`df|tr -s " "|grep sda|cut -d " " -f5|tr -d %`
 
[ $use -ge 80 ] && echo "磁盘使用量过高" || echo "磁盘剩余量足够"
 
 
[root@localhost ~]#bash scandisk.sh 
磁盘剩余量足够

如果需要通过邮箱来提醒

 
#!/bin/bash
use=`df|tr -s " "|grep sda|cut -d " " -f5|tr -d %`
 
[ $use -ge 80 ] && echo "磁盘使用量过高"|mail -s warning [email protected] || echo "磁盘剩余量足够"
5.3验证网络是否通畅
[root@localhost ~]#vim p.sh
 
#!/bin/bash
 
ping -c2 -W1 $1 &>/dev/null  && echo "$1 is online" || echo "$1 is offline"
#ping两个包 延迟1秒返回 将ping的内容转至垃圾箱,如果ping两个包成功,打印$!位置参数是在线的;如果ping两个包不成功,打印$1位置参数是脱机的
 
[root@localhost ~]#bash p.sh 192.168.241.11
192.168.241.11 is online
[root@localhost ~]#bash p.sh 192.168.241.1
192.168.241.1 is online
[root@localhost ~]#bash p.sh 192.168.241.12
192.168.241.12 is offline
5.4双中括号 [[ ]]

[[ expression ]]用法

==  左侧字符串是否和右侧的PATTERN相同

注意:此表达式用于[[  ]]中,PATTERN为通配符

=~  左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配

注意:此表达式用于[[  ]]中:扩展的正则表达式

[root@localhost ~]#help [
[: [ 参数... ]
    估值条件表达式。
    
    是内嵌命令 "test" 的同义词,但是最后一个参数必须是
    字符 `]',以匹配起始的 `['。
[[ ... ]]: [[ 表达式 ]]
    执行条件命令。
    
    根据条件表达式 EXPRESSION 的估值返回状态0或1。表达式按照
    `test' 内嵌的相同条件组成,或者可以有下列操作符连接而成:
    
      ( EXPRESSION )	返回 EXPRESSION 表达式的值
      ! EXPRESSION		如果 EXPRESSION表达式为假则为真,否则为假
      EXPR1 && EXPR2	如果 EXPR1 和 EXPR2 表达式均为真则为真,否则为假
      EXPR1 || EXPR2	如果 EXPR1 和 EXPR2 表达式中有一个为真则为真,否则为假
    
    当使用 `==' 和 `!=' 操作符时,操作符右边的字符串被用作模式并且执行一个
    匹配。当使用 `=~' 操作符时,操作符右边的字符串被当作正则表达式来进行
    匹配。
    
    操作符 && 和 || 将不对 EXPR2 表达式进行估值,如果 EXPR1 表达式足够确定
    整个表达式的值。
    
    退出状态:
    根据 EXPRESSION 的值为0或1。
[root@localhost ~]#file=test.log
[root@localhost ~]#[[ $file == "*.log" ]];echo $?
1
[root@localhost ~]#[[ $file == *.log ]];echo $?
0
[root@localhost ~]#[[ $file =~ log$ ]];echo $?
0

==开启通配符;=~开启正则表达式

二、if语句

if是关键字  不是命令

[root@localhost ~]#type if
if 是 shell 关键字
[root@localhost ~]#help if
if: if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi
    根据条件执行命令。
    
    `if COMMANDS'列表被执行。如果退出状态为零,则执行`then COMMANDS' 
    列表。否则按顺序执行每个 `elif COMMANDS'列表,并且如果它的退出状态为
    零,则执行对应的 `then COMMANDS' 列表并且 if 命令终止。否则如果存在的
    情况下,执行 `else COMMANDS'列表。整个结构的退出状态是最后一个执行
    的命令的状态,或者如果没有条件测试为真的话,为零。
    
    退出状态:
    返回最后一个执行的命令的状态。

2.if语句的结构

2.1单分支

shell脚本第二章条件语句_第4张图片

格式1:
if  判断条件 ;then
执行的命令
fi
 
 
格式2:
if 判断条件
then
执行的命令
fi
 
 
格式3:
if  判断条件;then;执行的命令;fi
[root@localhost ~]#vim scandisk.sh 
 
#!/bin/bash
 
if [ `df|tr -s " "|grep sda|cut -d " " -f5|tr -d %` -ge 80 ]
then
echo "磁盘剩余严重不足"
fi
 
 
[root@localhost ~]#dd if=/dev/zero of=/boot/bigfile
 
[root@localhost ~]#bash scandisk.sh 
磁盘剩余严重不足
 2.2双分支

shell脚本第二章条件语句_第5张图片

if 判断条件
then
执行命令1
else
执行命令2
fi
[root@localhost ~]#vim h.sh 
 
#!/bin/bash
 
systemctl status httpd &> /dev/null
if [ $? -eq 0 ]
 then
 echo "httpd 服务正在运行"
 else
 systemctl start httpd
fi
 
 
[root@localhost ~]#bash h1.sh 
httpd 服务正在运行
[root@localhost ~]#systemctl stop httpd.service 
[root@localhost ~]#bash h1.sh 
[root@localhost ~]#systemctl status httpd.service 
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2024-01-24 16:14:59 CST; 16s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 8800 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─8800 /usr/sbin/httpd -DFOREGROUND
           ├─8803 /usr/sbin/httpd -DFOREGROUND
           ├─8804 /usr/sbin/httpd -DFOREGROUND
           ├─8805 /usr/sbin/httpd -DFOREGROUND
           ├─8806 /usr/sbin/httpd -DFOREGROUND
           └─8807 /usr/sbin/httpd -DFOREGROUND
 
1月 24 16:14:59 localhost.localdomain systemd[1]: Starting The Apache HTTP...
1月 24 16:14:59 localhost.localdomain httpd[8800]: AH00558: httpd: Could n...
1月 24 16:14:59 localhost.localdomain systemd[1]: Started The Apache HTTP ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]#bash h1.sh 
httpd 服务正在运行
 2.2.1嵌套
[root@localhost ~]#vim h.sh 
#!/bin/bash
 
systemctl status httpd &> /dev/null
if [ $? -eq 0 ]
 then
 echo "httpd 服务正在运行"
 else
 systemctl start httpd
      if [ $? -eq 0 ]
        then
        echo "服务正常启动"
        else
        echo “service is not running please check it”
      fi
fi
 
[root@localhost ~]#bash h.sh 
httpd 服务正在运行
[root@localhost ~]#systemctl stop httpd.service 
[root@localhost ~]#bash h.sh 
服务正常启动
2.3多分支
shell脚本第二章条件语句_第6张图片
if 判断条件
then
执行命令1
elif 判断条件
执行命令2
elif
执行命令3
......
else
执行命令n
fi
 2.3.1判断操作系统安装httpd服务 
[root@localhost ~]#vim az.sh
 
 
#!/bin/bash
#安装httpd 服务  先判断 操作系统  如果是Centos 就yum 安装   如果是ubuntu  apt 安装  其他暂不支持
 
if  grep -q  centos /etc/os-release
then
yum install httpd -y &>/dev/null
  if  [ $? -eq 0 ]
    then
    echo "安装成功"
    else
    echo "安装失败请检查"
  fi
elif grep -p ubuntu /etc/os-release
then
apt install apache2 -y &>/dev/null
  if  [ $? -eq 0 ]
    then
    echo "安装成功"
    else
    echo "安装失败请检查"
  fi
else
echo 
fi
 
 
[root@localhost ~]#bash az.sh 
安装成功
2.3.2判断分数级别
[root@localhost ~]#vim fenshu.sh
 
 
#!/bin/bash
#90-100 优秀 70-89 良好 60-69 及格 0-59 不及格 其他输入错误请重新输入
 
read -p "请输入你的分数(0-100 的正整数):"  num
 
if  [ $num -ge 90 -a $num -le 100 ]
then
echo "优秀"
elif [ $num -ge 70 -a $num -le 89 ]
then
echo "良好"
elif [ $num -ge 60 -a $num -le 69 ]
then
echo "及格"
elif [ $num -ge 0 -a $num -le 59 ]
then
echo "不及格且罚抄30遍"
else
echo "输入有误,请重新输入"
bash $0
#再运行一遍脚本
fi
 
 
 
[root@localhost ~]#bash fenshu.sh 
请输入你的分数(0-100 的正整数):99
优秀
[root@localhost ~]#bash fenshu.sh 
请输入你的分数(0-100 的正整数):85
良好
[root@localhost ~]#bash fenshu.sh 
请输入你的分数(0-100 的正整数):71
良好
[root@localhost ~]#bash fenshu.sh
请输入你的分数(0-100 的正整数):60
及格
[root@localhost ~]#bash fenshu.sh
请输入你的分数(0-100 的正整数):59
不及格且罚抄30遍
[root@localhost ~]#bash fenshu.sh
请输入你的分数(0-100 的正整数):55555
输入有误,请重新输入
请输入你的分数(0-100 的正整数):11111
输入有误,请重新输入
请输入你的分数(0-100 的正整数):66
及格
2.3.3包剪锤
[root@localhost ~]#vim bjc.sh
 
 
#!/bin/bash
read -p "请输入 1(包)2(剪)3(锤):"  h
 
m=`echo $[RANDOM%3+1]`
 
 
#平局
if  [ $h -eq $m ]
then
echo "平局"
elif [ $h -eq 1 -a $m -eq 3 -o $h -eq 2 -a $m -eq 1 -o $h -eq 3 -a $m -eq 2 ]
then
echo "你赢了"
else
echo "你输了"
 
fi
 
 
[root@localhost ~]#bash bjc.sh 
请输入 1(包)2(剪)3(锤):1
你赢了
[root@localhost ~]#bash bjc.sh 
请输入 1(包)2(剪)3(锤):2
你输了
[root@localhost ~]#bash bjc.sh 
请输入 1(包)2(剪)3(锤):3
平局
2.3.4鸡兔同笼

鸡兔同笼,是中国古代著名典型趣题之一,记载于《孙子算经》之中。

今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

[root@localhost ~]#vim jttl.sh
#!/bin/bash
 
read  -p "脚的数量:"   jiao
read  -p "头的数量:"   tou
JIAO=$[jiao-tou]
#兔子和鸡各抬起一只脚
 
 
if [ $jiao  -ge 0   ]
then
tujiao=$[jiao-tou-tou]
#兔子和鸡各抬起两只脚(此时鸡的脚都抬起来了,每只兔子各剩2只脚)
tnum=$[tujiao/2]
#兔脚的数量除以2代表每2只脚对应一只兔子,输出此时兔子的数量
jnum=$[tou-tnum]
#总头数量减去兔子的数量就是鸡的数量
echo "------------------------------------------------------------"
echo "鸡和兔的数量分别为:"
echo "兔的数量: $tnum"
echo "鸡的数量:$jnum"
fi
 
if  [ $tnum -le 0 ]
then
echo "您输入的参数有误,请确认后重新输入"
bash  $0
 
 
[root@localhost ~]#bash jttl.sh
 
[root@localhost ~]#bash jttl.sh 
脚的数量:94
头的数量:35
------------------------------------------------------------
鸡和兔的数量分别为:
兔的数量: 12
鸡的数量:23
2.3.5删除无用的账户信息
[root@localhost ~]#vim xtuser.sh
 
#!/bin/bash
read -p "请输入用户名:" user
if  grep $user /etc/passwd &> /dev/null
then
   if [ -d /home/$user ]
   then
   echo "该用户状态正常"
   else
      read -p "该用户没有家目录,是否删除该用户,请输入[yes/no]:" ask
         if [ $ask == yes ]
         then
         echo "正在删除用户..."
         userdel $user &> /dev/null;sleep 2
         echo "该用户已经删除"
         elif [ $ask==no ]
         then
         exit
         fi
   fi
else
     echo  "该用户不存在"
fi
 
 
 
[root@localhost ~]#useradd cxk
[root@localhost ~]#cat /etc/passwd|grep cxk
cxk:x:1001:1001::/home/cxk:/bin/bash
[root@localhost ~]#useradd -M wsc
[root@localhost ~]#cat /etc/passwd|grep wsc
wsc:x:1002:1002::/home/wsc:/bin/bash
[root@localhost ~]#bash xtuser.sh 
请输入用户名:cxk
该用户状态正常
[root@localhost ~]#bash xtuser.sh 
请输入用户名:wsc
该用户没有家目录,是否删除该用户,请输入[yes/no]:yes
正在删除用户...
该用户已经删除
[root@localhost ~]#cat /etc/passwd|grep wsc

三、case语句

1.定义

case 语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写。
case 语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个 不同的条件,而 case 语句只是判断一个变量的不同取值。

[root@localhost ~]#help case
case: case 词 in [模式 [| 模式]...) 命令 ;;]... esac
    基于模式匹配来执行命令。
    
    基于 PATTERN 模式匹配的词 WORD,有选择的执行 COMMANDS 命令。
    `|' 用于分隔多个模式。
    
    退出状态:
    返回最后一个执行的命令的状态。

2.格式

case  $i  in
1)
命令1
;;
#英文状态的;
2)
命令2
;;
3)
命令3
;;
*)
命令n
esac

case 行尾必须为单词“in”,每一模式必须以右括号“)”结束。  双分号“;;”表示命令序列的结束。  模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号 “|”表示或,如“A|B”。 最后的“*)”表示默认模式,其中的*相当于通配符。 

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

3.case语句结构

shell脚本第二章条件语句_第7张图片
4.case实验 

4.1判断数字字母
[root@localhost ~]#vim case.sh
 
 
 
#!/bin/bash
#输入一个字符 判断输入的是字母 数字还是特殊字符
read -p "请输入一个字符:"   key
case  $key in
[a-z]|[A-Z])
echo "您输入的是字母"
;;
#英文分号
[0-9])
echo "您输入的是数字"
;;
*)
echo "您输入的是特殊字符"
esac
 
 
 
[root@localhost ~]#bash case.sh 
请输入一个字符:5
您输入的是数字
[root@localhost ~]#bash case.sh 
请输入一个字符:a
您输入的是字母
[root@localhost ~]#bash case.sh 
请输入一个字符:A
您输入的是字母
[root@localhost ~]#bash case.sh 
请输入一个字符:?
您输入的是特殊字符
4.2判断yes/no

方法一

[root@localhost ~]#vim test.sh 
 
#!/bin/bash
#判断输入的是yes(y,Y,yES,YES,YeS,yeS)或者no(N,n,no,No,nO,NO)
 
read -p "请输入 yes 或者 no :"   i
 
case  $i in
[yY]|[yY][eE][sS])
echo "您输入的是yes"
;;
[nN]|[nN][oO])
echo "您输入的是no"
;;
*)
echo "您输入有误,请重新输入yes 或 no"
bash $0
;;
esac
 
 
[root@localhost ~]#bash test.sh 
请输入 yes 或者 no :y
您输入的是yes
[root@localhost ~]#bash test.sh 
请输入 yes 或者 no :yes
您输入的是yes
[root@localhost ~]#bash test.sh 
请输入 yes 或者 no :YeS    
您输入的是yes
[root@localhost ~]#bash test.sh 
请输入 yes 或者 no :no
您输入的是no
[root@localhost ~]#bash test.sh 
请输入 yes 或者 no :No
您输入的是no

 方法二

[root@localhost ~]#vim test1.sh 
 
#!/bin/bash
#判断输入的是yes(y,Y,yES,YES,YeS,yeS)或者no(N,n,no,No,nO,NO)
 
read -p "请输入 yes 或者 no :"   i
 
num=`echo $i|tr 'A-Z' 'a-z'`
 
case  $num in
y|yes)
echo "您输入的是yes"
;;
n|no)
echo "您输入的是no"
;;
*)
echo "您输入有误,请重新输入yes 或 no"
bash $0
;;
esac
 
 
 
[root@localhost ~]#bash test1.sh 
请输入 yes 或者 no :y
您输入的是yes
[root@localhost ~]#bash test1.sh 
请输入 yes 或者 no :ye
您输入有误,请重新输入yes 或 no
请输入 yes 或者 no :yes
您输入的是yes
[root@localhost ~]#bash test1.sh 
请输入 yes 或者 no :YeS
您输入的是yes
[root@localhost ~]#bash test1.sh 
请输入 yes 或者 no :n
您输入的是no
[root@localhost ~]#bash test1.sh 
请输入 yes 或者 no :NO
您输入的是no
[root@localhost ~]#bash test1.sh 
请输入 yes 或者 no :No
您输入的是no
4.3小小工具箱
[root@localhost ~]#vim xxgjx.sh
 
#!/bin/bash
 
cat <
4.4成绩分数等第
[root@localhost ~]#vim score.sh
 
#!/bin/bash
read -p "请输入您的分数(0-100) : "  score
[[ $score -ge 85 && $score -le 100 ]] && a="great"
[[ $score -ge 70 && $score -lt 85 ]] && a="standard"
[[ $score -ge 0 && $score -lt 70 ]] && a="false"
 
case $a in
great)
   echo "$score分,优秀!"
;;
standard)
   echo "$score 分,合格!"
;;
false)
   echo "$score 分,不合格!"
;;
*)
   echo "输入有误!"
esac 
 
[root@localhost ~]#bash score.sh 
请输入您的分数(0-100) : 2
2 分,不合格!
[root@localhost ~]#bash score.sh 
请输入您的分数(0-100) : 18
18 分,不合格!
[root@localhost ~]#bash score.sh 
请输入您的分数(0-100) : 99
99分,优秀!
[root@localhost ~]#bash score.sh 
请输入您的分数(0-100) : 81
81 分,合格!
[root@localhost ~]#bash score.sh 
请输入您的分数(0-100) : 79
79 分,合格!
[root@localhost ~]#bash score.sh 
请输入您的分数(0-100) : 59
59 分,不合格!
[root@localhost ~]#bash score.sh 
请输入您的分数(0-100) : 70
70 分,合格!
[root@localhost ~]#vim score1.sh
 
#!/bin/bash
read -p "请输入你的分数: " score
[ $score -eq 100 ] && a=0
[ $score -ge 90 ] &&[ $score -lt 100 ] && a=10
[ $score -ge 70 -a $score -le 89 ] && a=20
[ $score -ge 60 -a $score -le 69 ] && a=30
[ $score -ge 0 -a $score -lt 60 ] && a=40
 
case $a in
0)
echo "秀儿!"
;;
10)
echo "$score 分,抄10遍!"
;;
20)
echo "$score 分,抄20遍!"
;;
30)
echo "$score 分,抄30遍!"
;;
40 )
echo "$score 分,全抄30遍!"
;;
*)
echo  " 输入有误! "
esac
 
[root@localhost ~]#bash score1.sh 
请输入你的分数: 99
99 分,抄10遍!
[root@localhost ~]#bash score1.sh 
请输入你的分数: 80
80 分,抄20遍!
[root@localhost ~]#bash score1.sh 
请输入你的分数: 70
70 分,抄20遍!
[root@localhost ~]#bash score1.sh 
请输入你的分数: 69
69 分,抄30遍!
[root@localhost ~]#bash score1.sh 
请输入你的分数: 20
20 分,全抄30遍!
[root@localhost ~]#vim score2.sh
 
 
#!/bin/bash
read -p " 请输入你的分数: " score
case $score in
100 )
echo "秀儿!"
;;
9[0-9])
echo "$score 分,抄10遍!"
;;
[78][0-9])
echo "$score 分,抄20遍!"
;;
6[0-9])
echo "$score 分,抄30遍!"
;;
[0-9]|[1-5][0-9] )
echo "$score 分,全抄30遍!"
;;
*)
echo " 输入有误! "
esac
 
 
 
[root@localhost ~]#bash score2.sh 
 请输入你的分数: 80
80 分,抄20遍!
[root@localhost ~]#bash score2.sh 
 请输入你的分数: 91
91 分,抄10遍!
[root@localhost ~]#bash score2.sh 
 请输入你的分数: 70
70 分,抄20遍!
[root@localhost ~]#bash score2.sh 
 请输入你的分数: 55
55 分,全抄30遍!
[root@localhost ~]#bash score2.sh 
 请输入你的分数: 100
秀儿!
[root@localhost ~]#vim score3.sh 
 
#!/bin/bash
read -p "请输入你的分数" score
 
case $score in
100)
echo "$score 你太厉害了"
;;
[89][0-9])
#80-99
echo "$score 表现得还可以嘛小伙子"
;;
[67][0-9])
#60-79
echo "$score 还好还好 你及格了 不用罚抄了"
;;
[0-9]|[1-5][0-9])
#0-9和10-59
echo "$score 你完了 卷子全抄30遍"
;;
*)
echo "输入错误,请重新输入"
esac
 
 
[root@localhost ~]#bash score3.sh 
请输入你的分数100
100 你太厉害了
[root@localhost ~]#bash score3.sh 
请输入你的分数89  
89 表现得还可以嘛小伙子
[root@localhost ~]#bash score3.sh 
请输入你的分数71
71 还好还好 你及格了 不用罚抄了
[root@localhost ~]#bash score3.sh 
请输入你的分数59
59 你完了 卷子全抄30遍
[root@localhost ~]#bash score3.sh 
请输入你的分数8
8 你完了 卷子全抄30遍
4.5包剪锤
[root@localhost ~]#vim bjc1.sh 
 
#!/bin/bash
read -p "请输入 1(包)2(剪)3(锤):"  h
 
m=`echo $[RANDOM%3+1]`
 
 
 
case $h in
1)
h="包"
;;
2)
h="剪"
;;
3)
h="锤"
;;
esac
 
case $m in
1)
m="包"
;;
2)
m="剪"
;;
3)
m="锤"
;;
esac
 
 
if  [ $h = $m ]
then
echo "平局"
echo "你出的是 $h"
echo "机器出的是 $m"
elif [ $h = "包" -a $m = "锤" -o $h = "剪" -a $m = "包" -o $h = "锤" -a $m = "剪" ]
then
echo "你赢了"
echo "你出的是 $h"
echo "机器出的是 $m"
else
echo "你输了"
echo "你出的是 $h"
echo "机器出的是 $m"
fi
 
 
 
 
 
[root@localhost ~]#bash bjc1.sh 
请输入 1(包)2(剪)3(锤):1
平局
你出的是 包
机器出的是 包
[root@localhost ~]#bash bjc1.sh 
请输入 1(包)2(剪)3(锤):2
你输了
你出的是 剪
机器出的是 锤
[root@localhost ~]#bash bjc1.sh 
请输入 1(包)2(剪)3(锤):3
你赢了
你出的是 锤
机器出的是 剪
4.6跳板机
[root@localhost ~]#vim tbj.sh 
 
#!/bin/bash
web1="192.168.241.11"
mysql="192.168.241.22"
docker="192.168.241.23"
read -p "请输入要去往的地址:" i
 
case $i in
1)
i="1"
ssh $web1
;;
2)
i="2"
ssh $mysql
;;
3)
i="3"
ssh $docker
;;
*)
echo "输入错误,请重新输入"
exit
;;
esac
 
 
[root@localhost ~]#bash tbj.sh 
请输入要去往的地址:1
The authenticity of host '192.168.241.11 (192.168.241.11)' can't be established.
ECDSA key fingerprint is SHA256:k/dmSIE+ic90gNaqecVvZT0PdW+9hJf9EwJQDXY1f7w.
ECDSA key fingerprint is MD5:e1:61:2b:5d:fe:10:a9:72:1f:c2:7e:2b:5b:51:f4:7c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.241.11' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last login: Wed Jan 24 16:07:18 2024 from 192.168.241.1
/etc/profile
test.sh
bash_profile
bashrc
                                  _oo0oo_
                                 088888880
                                 88" . "88
                                 (| -_- |)
                                  0\ = /0
                               ___/'---'\___
                             .' \\|     |// '.
                            / \\|||  :  |||// \
                           /_ ||||| -:- |||||- \
                          |   | \\\  -  /// |   |
                          | \_|  ''\---/''  |_/ |
                          \  .-\__  '-'  __/-.  /
                        ___'. .'  /--.--\  '. .'___
                     ."" '<  '.___\_<|>_/___.' >'  "".
                    | | : '-  \'.;'\ _ /';.'/ - ' : | |
                    \  \ '_.   \_ __\ /__ _/   .-' /  /
                ====='-.____'.___ \_____/___.-'____.-'=====
                                  '=---='
  
  
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                        佛祖保佑    永无BUG    永不宕机
[root@localhost ~]#bash tbj.sh 
请输入要去往的地址:2
The authenticity of host '192.168.241.22 (192.168.241.22)' can't be established.
ECDSA key fingerprint is SHA256:CcASxxV4CvFA+6w68th3aaCYGbGB3UwaAK1xifsM/Pk.
ECDSA key fingerprint is MD5:d6:ee:2e:4d:f6:34:c5:14:0e:ef:99:8c:54:48:c6:be.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.241.22' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last login: Wed Jan 24 06:10:32 2024 from 192.168.241.1
*                   江城子 . 程序员之歌
 * 
 *               十年生死两茫茫,写程序,到天亮。
 *                   千行代码,Bug何处藏。
 *               纵使上线又怎样,朝令改,夕断肠。
 * 
 *               领导每天新想法,天天改,日日忙。
 *                   相顾无言,惟有泪千行。
 *               每晚灯火阑珊处,夜难寐,加班狂。
[root@node2 ~]#bash tbj.sh
bash: tbj.sh: 没有那个文件或目录
[root@node2 ~]#exit
登出
Connection to 192.168.241.22 closed.
[root@localhost ~]#bash tbj.sh 
请输入要去往的地址:3
The authenticity of host '192.168.241.23 (192.168.241.23)' can't be established.
ECDSA key fingerprint is SHA256:XsqlR59mxCKL1f8AGowiU4Gcond0/IZhpjiaqIsiooI.
ECDSA key fingerprint is MD5:2a:05:ae:b5:1d:48:bd:7c:95:51:73:cc:fc:b0:14:25.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.241.23' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last login: Thu Jan 25 03:10:22 2024 from 192.168.241.1
[root@node3 ~]#exit
登出
Connection to 192.168.241.23 closed.
4.7点菜
[root@localhost ~]#vim menu.sh 
 
cat <

你可能感兴趣的:(服务器,运维)