Bash Shell 脚本中的循环语句

文章目录

    • [Bash Shell 脚本中的循环语句](#Bash Shell 脚本中的循环语句)
      • [一、for 循环](#一、for 循环)
        • [1.1 列表循环](#1.1 列表循环)
        • [1.2 不带列表循环(C 风格的 for 循环)](#1.2 不带列表循环(C 风格的 for 循环))
      • 二、案例示例
        • [2.1 打印 1-5 的数字](#2.1 打印 1-5 的数字)
        • [2.2 打印 5 次 "hello world"](#2.2 打印 5 次 "hello world")
        • [2.3 打印 abcde](#2.3 打印 abcde)
        • [2.4 输出 0-50 之间的偶数](#2.4 输出 0-50 之间的偶数)
      • 三、应用技巧
        • [3.1 使用花括号和 seq 的技巧](#3.1 使用花括号和 seq 的技巧)
      • [四、for 循环的实际应用](#四、for 循环的实际应用)
        • [4.1 批量添加用户](#4.1 批量添加用户)
        • [4.2 根据 IP 地址列表检查主机状态](#4.2 根据 IP 地址列表检查主机状态)
      • 五、循环控制语句
        • [5.1 continue](#5.1 continue)
        • [5.2 break](#5.2 break)
        • [5.3 exit](#5.3 exit)
      • [六、while 循环](#六、while 循环)
        • [6.1 语法结构](#6.1 语法结构)
        • [6.2 示例:打印 1-5](#6.2 示例:打印 1-5)
        • [6.3 死循环](#6.3 死循环)
      • [七、until 循环](#七、until 循环)
        • [7.1 语法结构](#7.1 语法结构)
        • [7.2 示例:计算 1-50 的和](#7.2 示例:计算 1-50 的和)
      • 八、数组的定义和操作
        • [8.1 数组定义方式](#8.1 数组定义方式)
        • [8.2 获取数组长度](#8.2 获取数组长度)
        • [8.3 遍历数组](#8.3 遍历数组)
      • 九、案例:幸运会员
  • 输出最终的计数结果

Bash Shell 脚本中的循环语句

​ 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清单检查各主机的存活状态。当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。此时,使用 for 循环会使任务变得更加简单和高效。

一、for 循环

1.1 列表循环

语法结构:

bash 复制代码
for 变量名 in {list}
do
    command
done

示例:

bash 复制代码
for i in {a..c}
do
    echo $i
done
bash 复制代码
for i in {1..5}    # {}里面不识别变量
do
    echo $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可以引用变量
do
    echo $i
done
1.2 不带列表循环(C 风格的 for 循环)

语法结构:

bash 复制代码
for ((expr1; expr2; expr3))
do
    command
done

示例:

bash 复制代码
#!/bin/bash
for ((i=1; i<=5; i++))
do
    echo $i
done

二、案例示例

2.1 打印 1-5 的数字
bash 复制代码
#!/bin/bash

for i in {1..5}
do
    echo $i
done
2.2 打印 5 次 "hello world"
bash 复制代码
#!/bin/bash

for i in {1..5}
do
    echo "hello world"
done
2.3 打印 abcde
bash 复制代码
#!/bin/bash

for i in a b c d e
do
    echo $i
done
2.4 输出 0-50 之间的偶数
bash 复制代码
#!/bin/bash

for i in {0..50..2}  # ..2代表步长为2,每隔2个
do
    echo $i
done

三、应用技巧

3.1 使用花括号和 seq 的技巧

示例:

bash 复制代码
for i in {1..50..2}  # 1-50 的奇数
do
    echo $i
done
bash 复制代码
for i in $(seq 10)  # 1-10 正序排列
do
    echo $i
done
bash 复制代码
for i in $(seq 10 -1 1)  # 1-10 倒序排列
do
    echo $i
done
bash 复制代码
for i in $(seq 1 2 10)  # 1-10 的奇数,中间为步长
do
    echo $i
done

四、for 循环的实际应用

4.1 批量添加用户

方式一:

bash 复制代码
#!/bin/bash

for i in {1..5}
do
    useradd stu$i
    echo "123" | passwd --stdin stu$i
done

方式二:

bash 复制代码
#!/bin/bash

ULIST=$(cat /root/users.txt) 

for UNAME in $ULIST
do
    useradd $UNAME
    echo "123456" | passwd --stdin $UNAME &>/dev/null 
done
4.2 根据 IP 地址列表检查主机状态

方式一:

bash 复制代码
#!/bin/bash

HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
    ping -c 3 -i 0.2 -W 3 $IP &> /dev/null

    if [ $? -eq 0 ]; then
        echo "Host $IP is up."
    else
        echo "Host $IP is down."
    fi
done

方式二:

bash 复制代码
#!/bin/bash

network="192.168.10"
for addr in {1..254}
do
    ping -c 2 -i 0.5 -W 3 $network.$addr &> /dev/null
    if [ $? -eq 0 ]; then
        echo "$network.$addr is up"
    else
        echo "$network.$addr is down."
    fi
done

五、循环控制语句

5.1 continue

示例:

bash 复制代码
#!/bin/bash

for ((i=1; i<=5; i++))
do
    if [ $i -eq 3 ]; then
        continue
    else
        echo $i
    fi
done
5.2 break

示例:

bash 复制代码
#!/bin/bash

for ((i=1; i<=10; i++))
do
    if [ $i -eq 8 ]; then
        break
    else
        echo $i
    fi
done
5.3 exit

示例:

bash 复制代码
#!/bin/bash

for i in {1..5}
do
    if [ $i -eq 3 ]; then
        exit 100 
    else
        echo $i
    fi
done

echo "hi"

六、while 循环

6.1 语法结构
bash 复制代码
while 表达式
do
    command
done
6.2 示例:打印 1-5
bash 复制代码
#!/bin/bash

i=1
while [ $i -le 5 ]
do
    echo $i
    let i++
done
echo "最后 i 的值为: $i"
6.3 死循环

示例:

bash 复制代码
while true
do
    command
done

七、until 循环

7.1 语法结构
bash 复制代码
until 表达式
do
    command
done
7.2 示例:计算 1-50 的和
bash 复制代码
#!/bin/bash

i=1
sum=0
until [ $i -eq 51 ]
do
    sum=$((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/bash

arr=(1 2 3 4 5 6)
for i in ${arr[*]}
do
    echo $i
done

九、案例:幸运会员

示例:

bash 复制代码
#!/bin/bash

# 启用调试模式
set -x

# 初始化计数变量
a=0
b=0
c=0

# 循环10次
for ((i=1; i<=10; i++))
do
    # 生成一个随机数,范围为1到3
    num=$((RANDOM % 3 + 1))

    # 从文件中读取相应的行,提取第二列的值
    LIST=$(cat /opt/name.txt | grep "^$num:" | awk -F: '{print $2}')

    # 根据提取的值进行相应的计数
    case $LIST in
        zhangsan)
            ((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 in
    zhangsan)
        ((a++))
        ;;
    lisi)
        ((b++))
        ;;
    *)
        ((c++))
        ;;
esac

# 输出当前的 LIST 值
echo "$LIST"

done

输出最终的计数结果

echo "zhangsan: $a 次, lisi: $b 次,

其他: $c 次"

复制代码
相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024064 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it5 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海6 小时前
scala String
大数据·开发语言·scala
qq_327342736 小时前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍6 小时前
Scala的Array数组
开发语言·后端·scala