千家信息网

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

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,case多分支语句case语句的结构:针对变量的不同取值,分别执行不同的命令列case 变量值 in模式1) 命令序列1 ;;模式2) 命令序列2 ;;.....*
千家信息网最后更新 2026年11月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:关闭调节模式
数组 命令 用户 脚本 输入 循环 字符 序列 函数 示例 语句 元素 方法 条件 数字 在线 格式 模式 类型 结构 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技图片 国智互联网科技 深圳恒合互联网络科技有限公司 致骋互联网科技 亿策互联网科技 深圳天众互联网科技公司 顺玮阁互联网科技 北京华百购互联网科技有限公司 宁夏众和广鑫互联网科技有限公司 新兴科技互联网创新大赛颁奖典礼 未来五年的互联网科技 佛山市翊博互联网络科技有限公司 晋城互联网科技 中科明德北京互联网科技 怎样加入科技互联网 智帮互联网科技公司最近动向 黑云互联网科技有限公司 江苏互联网科技小贷 安徽零酒互联网科技有限公司 陕西彩京云互联网科技有限公司 广东万易互联网科技有限公司惠州分公司 互联网科技网 港股互联网科技股 盛创互联网科技有限公司 厦门比较好的科技互联网公司 中天科技中国工业互联网 抖集互联网科技技术咨询 科技互联网经济论坛 亚光科技低轨卫星互联网 上海旺乐尼互联网科技有限公司
0