千家信息网

Shell编程之case多分支语句、循环语句(for、while等)、Shell函数、Shell数组

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,case多分支语句case语句的结构:针对变量的不同取值,分别执行不同的命令列case 变量值 in模式1) 命令序列1 ;;模式2) 命令序列2 ;;.....*
千家信息网最后更新 2025年12月03日Shell编程之case多分支语句、循环语句(for、while等)、Shell函数、Shell数组

case多分支语句

case语句的结构:

针对变量的不同取值,分别执行不同的命令列

case  变量值  in模式1)    命令序列1        ;;模式2)    命令序列2    ;;.....*)默认命令序列esac

示例

字符类型识别:

  • 提示用户输入一个字符;
  • 判断出该字符是字母、数字或者其他字符。

脚本如下:

[root@localhost opt]# vim test01.sh#!/bin/bashread -p "请输入一个字符:" keycase $key in[a-z]|[A-Z])        echo "你输入的是字母";;[0-9])        echo "你输入的是数字";;*)        echo "你输入的是特殊符号"esac
执行结果如下:[root@localhost opt]# chmod +x test01.sh [root@localhost opt]# ./test01.sh 请输入一个字符:3你输入的是数字[root@localhost opt]# ./test01.sh 请输入一个字符:d你输入的是字母[root@localhost opt]# ./test01.sh 请输入一个字符:#你输入的是特殊符号[root@localhost opt]# 

循环语句

for循环语句:

循环结构:读取不同的变量值,用来逐个执行同一组命令。

for  变量名  in  取值列表do    命令序列done

示例1

批量添加用户:

  • 用户名存放在users.txt文件中,每行一个;
  • 初始密码均设为123456;
  • 验证脚本。

具体实验如下

[root@localhost opt]# tail -5 /etc/passwdavahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinjiang:x:1000:1000:jiang:/home/jiang:/bin/bashapache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin[root@localhost opt]# vim users.txt[root@localhost opt]# cat users.txt zhangsanlisiwangwuzhaoliu[root@localhost opt]# vim test02.sh[root@localhost opt]# cat test02.sh                                         //shell脚本如下#!/bin/bashTMP=$(cat /opt/users.txt)for USER in $TMPdo    useradd $USER && echo "123456" | passwd --stdin $USER &> /dev/nulldone[root@localhost opt]# chmod +x test02.sh [root@localhost opt]# ./test02.sh [root@localhost opt]# tail -5 /etc/passwdapache:x:48:48:Apache:/usr/share/httpd:/sbin/nologinzhangsan:x:1001:1001::/home/zhangsan:/bin/bashlisi:x:1002:1002::/home/lisi:/bin/bashwangwu:x:1003:1003::/home/wangwu:/bin/bashzhaoliu:x:1004:1004::/home/zhaoliu:/bin/bash[root@localhost opt]# [root@localhost opt]# su zhangsan[zhangsan@localhost opt]$ su lisi密码:[lisi@localhost opt]$

示例2

根据IP地址检查主机状态:

  • IP地址存放在ipadds.txt文件中,每行一个;
  • 使用ping命令检测各主机的连通性。

shell脚本如下:

#!/bin/bashTMP=$(cat /opt/ipadds.txt)for USER in $TMPdo ping -c 3 -i 0.2 -w 3 $USER &> /dev/null if [ $? -eq 0 ] then  echo "$USER is up" else  echo "$USER is down" fidone

while循环语句:

循环结构:重复测试某个条件,只要条件成立则反复执行。

while  条件测试操作do    命令序列done

示例1

批量添加用户:

  • 用户名称以stu开头,按数字顺序进行编号;
  • 一共添加10个用户,即stu1、 stu2、....stu20;
  • 初始密码均设为123456。

shell脚本如下:

#!/bin/bashPRE="stu"num=1while [ $num -le 10 ]do  useradd $PRE$num  echo "123456" | passwd --stdin $PRE$num &> /dev/dull let num++done

示例2

猜商品价格:

  • 通过变量RANDOM获得随机数;
  • 提示用户猜测并记录次数,猜中后退出循环。

shell脚本如下:

#!/bin/bashTIMES=0PRICE=$(expr $RANDOM % 1000)while truedoread -p "请猜价格(0-999):" moneylet TIMES++     if [ $money -gt $PRICE ]     then          echo "您猜的太大"     elif [ $money -lt $PRICE ]     then                echo "您猜的太小"     else                  echo "您猜对了,正确价格为:$num"         echo "您一共猜了$TIMES次"     break      fi done 

until循环语句:

循环结构:重复测试某个条件,只要条件不成立则反复执行。

until  条件测试操作do   命令序列done

示例1

计算1~50的和值:

  • 通过循环累加的方式计算1~50的和值。

实验如下:

[root@localhost opt]# vim test04.sh[root@localhost opt]# cat test04.sh #!/bin/bashi=0sum=0until [ $i -eq 51 ]do    let sum+=i    let i++doneecho $sum[root@localhost opt]# chmod +x test04.sh [root@localhost opt]# ./test04.sh 1275[root@localhost opt]# 

示例2
为指定用户发送在线消息:

  • 若用户不在线(未登录系统),则每10分钟试一次, 直至用户登录系统后在发送信息;
  • 用户名与消息通过位置参数传递给脚本。

脚本如下:

#!/bin/bashusername=$1#判断信息格式if [ $# -lt 1 ];then        echo "Usage:`basename $0` []"        exit 1fi#判断用户是否存在if grep "^$username:" /etc/passwd > /dev/nullthen :else        echo "用户不存在"        exit 1fi#用户是否在线,如果不在线每5秒联系一次until who|grep "^$username" > /dev/nulldo        echo "用户不在线"        sleep 5donemes=$*echo $mes | write $username

Shell函数

Shell函数定义:

将命令序列按格式写在一起可方便重复使用命令序列。

[ function ] 函数名(){    命令序列        [return x]}                                              //使用return或exit可以显式地结束函数

调用函数的方法:

函数名 [参数1] [参数2]

示例

两个数字求和:

  • 通过sum () {}定义函数;
  • 通过调用函数求两个数和。

实验如下:

[root@localhost opt]# vim test06.sh [root@localhost opt]# cat test06.sh #!/bin/bashsum(){    s=`expr $1 + $2`    echo $s }[root@localhost opt]# chmod +x test06.sh [root@localhost opt]# ./test06.sh [root@localhost opt]# sum 5 611[root@localhost opt]#

Shell数组

应用场景包括:

  • 获取数组长度
  • 获取元素长度
  • 遍历元素
  • 元素切片
  • 元素替换
  • 元素删除
    ......

数组定义方法:

  • 方法一

数组名= (value0 value1 value2 ..)

  • 方法二

数组名= ([0]=value [1]=value [2]=value ...) //数组元素之间使用空格隔开

  • 方法三
列表名="value0 value1 value2 ..."数组名= ($列表名)
  • 方法四
数组名[0]="value"数组名[1]="value"数组名[2]="value"

数组包括的数据类型:

  • 数值类型
  • 字符类型:使用" "或' '定义

获取数组长度:

格式:${#数组名[@\*]}实例:[root@localhost ~]# arr_ nymber=(1 2 3 4 5);[root@localhost ~]#arr_ length=${#arr_ number[*]}[root@localhost ~]# echo $arr length5

读取某下标的赋值:

格式:${数组名[下标]}实例:[root@localhost ~]#arr_ index2=${arr_ number[2]}[root@localhost ~]# echo $arr_ index23

数组遍历:

[root@localhost ~]# for v in ${arr_ number[@]}> do>     echo $V> done12345

Shell脚本调试

echo命令

bash命令

语法:sh [-nvx] 脚本名

常用选项:

-n:不执行脚本,仅检查语法。没有语法问题不显示任何内容,有问题提示报错。-v:执行脚本时,先显示脚本内容,然后执行脚本。存在错误时,给出错误提示。-x:将执行的脚本内容输出到屏幕上。

set命令

set -x:开启调节模式set +x:关闭调节模式
0