文章目录
- Bash Shell 脚本中的循环语句
- 一、for 循环
- 1.1 列表循环
- 1.2 不带列表循环(C 风格的 for 循环)
- 二、案例示例
- 2.1 打印 1-5 的数字
- 2.2 打印 5 次 "hello world"
- 2.3 打印 abcde
- 2.4 输出 0-50 之间的偶数
- 三、应用技巧
- 3.1 使用花括号和 seq 的技巧
- 四、for 循环的实际应用
- 4.1 批量添加用户
- 4.2 根据 IP 地址列表检查主机状态
- 五、循环控制语句
- 5.1 continue
- 5.2 break
- 5.3 exit
- 六、while 循环
- 6.1 语法结构
- 6.2 示例:打印 1-5
- 6.3 死循环
- 七、until 循环
- 7.1 语法结构
- 7.2 示例:计算 1-50 的和
- 八、数组的定义和操作
- 8.1 数组定义方式
- 8.2 获取数组长度
- 8.3 遍历数组
- 九、案例:幸运会员
- 输出最终的计数结果
Bash Shell 脚本中的循环语句
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清单检查各主机的存活状态。当面对各种列表重复任务时,使用简单的 if
语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。此时,使用 for
循环会使任务变得更加简单和高效。
一、for 循环
1.1 列表循环
语法结构:
bash">for 变量名 in {list}
docommand
done
示例:
bash">for i in {a..c}
doecho $i
done
bash">for i in {1..5} # {}里面不识别变量
doecho $i
done
bash">for i in `seq 5` # seq 5=1、2、3、4、5序列
do echo $i
done
bash">a=10
for i in `seq $a` # seq可以引用变量
doecho $i
done
1.2 不带列表循环(C 风格的 for 循环)
语法结构:
bash">for ((expr1; expr2; expr3))
docommand
done
示例:
bash">#!/bin/bash
for ((i=1; i<=5; i++))
doecho $i
done
二、案例示例
2.1 打印 1-5 的数字
bash">#!/bin/bashfor i in {1..5}
doecho $i
done
2.2 打印 5 次 “hello world”
bash">#!/bin/bashfor i in {1..5}
doecho "hello world"
done
2.3 打印 abcde
bash">#!/bin/bashfor i in a b c d e
doecho $i
done
2.4 输出 0-50 之间的偶数
bash">#!/bin/bashfor i in {0..50..2} # ..2代表步长为2,每隔2个
doecho $i
done
三、应用技巧
3.1 使用花括号和 seq 的技巧
示例:
bash">for i in {1..50..2} # 1-50 的奇数
doecho $i
done
bash">for i in $(seq 10) # 1-10 正序排列
doecho $i
done
bash">for i in $(seq 10 -1 1) # 1-10 倒序排列
doecho $i
done
bash">for i in $(seq 1 2 10) # 1-10 的奇数,中间为步长
doecho $i
done
四、for 循环的实际应用
4.1 批量添加用户
方式一:
bash">#!/bin/bashfor i in {1..5}
douseradd stu$iecho "123" | passwd --stdin stu$i
done
方式二:
bash">#!/bin/bashULIST=$(cat /root/users.txt) for UNAME in $ULIST
douseradd $UNAMEecho "123456" | passwd --stdin $UNAME &>/dev/null
done
4.2 根据 IP 地址列表检查主机状态
方式一:
bash">#!/bin/bashHLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
doping -c 3 -i 0.2 -W 3 $IP &> /dev/nullif [ $? -eq 0 ]; thenecho "Host $IP is up."elseecho "Host $IP is down."fi
done
方式二:
bash">#!/bin/bashnetwork="192.168.10"
for addr in {1..254}
doping -c 2 -i 0.5 -W 3 $network.$addr &> /dev/nullif [ $? -eq 0 ]; thenecho "$network.$addr is up"elseecho "$network.$addr is down."fi
done
五、循环控制语句
5.1 continue
示例:
bash">#!/bin/bashfor ((i=1; i<=5; i++))
doif [ $i -eq 3 ]; thencontinueelseecho $ifi
done
5.2 break
示例:
bash">#!/bin/bashfor ((i=1; i<=10; i++))
doif [ $i -eq 8 ]; thenbreakelseecho $ifi
done
5.3 exit
示例:
bash">#!/bin/bashfor i in {1..5}
doif [ $i -eq 3 ]; thenexit 100 elseecho $ifi
doneecho "hi"
六、while 循环
6.1 语法结构
bash">while 表达式
docommand
done
6.2 示例:打印 1-5
bash">#!/bin/bashi=1
while [ $i -le 5 ]
doecho $ilet i++
done
echo "最后 i 的值为: $i"
6.3 死循环
示例:
bash">while true
docommand
done
七、until 循环
7.1 语法结构
bash">until 表达式
docommand
done
7.2 示例:计算 1-50 的和
bash">#!/bin/bashi=1
sum=0
until [ $i -eq 51 ]
dosum=$((sum + i))let i++
done
echo $sum
八、数组的定义和操作
8.1 数组定义方式
方式一:
bash">num=(11 22 33 44)
方式二:
bash">num=([0]=55 [1]=66 [2]=77 [4]=88)
方式三:
bash">list="11 12 13 14"
num=($list)
方式四:
bash">num[0]=11
num[1]=22
num[2]=33
8.2 获取数组长度
bash">arr_number=(10 20 30 40 50)
arr_length=${#arr_number[*]}
echo $arr_length
8.3 遍历数组
bash">#!/bin/basharr=(1 2 3 4 5 6)
for i in ${arr[*]}
doecho $i
done
九、案例:幸运会员
示例:
bash">#!/bin/bash# 启用调试模式
set -x# 初始化计数变量
a=0
b=0
c=0# 循环10次
for ((i=1; i<=10; i++))
do# 生成一个随机数,范围为1到3num=$((RANDOM % 3 + 1))# 从文件中读取相应的行,提取第二列的值LIST=$(cat /opt/name.txt | grep "^$num:" | awk -F: '{print $2}')# 根据提取的值进行相应的计数case $LIST inzhangsan)((a++));;lisi)((b++));;*)((c++));;esac# 输出当前的 LIST 值echo "$LIST"
done# 输出最终的计数结果
echo "zhangsan: $a 次, lisi: $b 次,其他: $c 次"
# 生成一个随机数,范围为1到3
num=$((RANDOM % 3 + 1))# 从文件中读取相应的行,提取第二列的值
LIST=$(cat /opt/name.txt | grep "^$num:" | awk -F: '{print $2}')# 根据提取的值进行相应的计数
case $LIST inzhangsan)((a++));;lisi)((b++));;*)((c++));;
esac# 输出当前的 LIST 值
echo "$LIST"
done
输出最终的计数结果
echo "zhangsan: $a 次, lisi: $b 次,
其他: $c 次"