Shell循环结构

发布于:2025-07-23 ⋅ 阅读:(11) ⋅ 点赞:(0)

1 for循环

  • 语法

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

  • for语句的执行流程

首先将列表中的第一个取值赋给变量,并执行 do…done循环体中的命令序列
然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列……
Ø依此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环

  • 示例
# 范围遍历数列
for i in {1..10}
do
        if [ $( expr $i % 2 ) -eq 0 ]
        then
                echo $i
        fi
done
# 遍历具体的数列
for i in 1 3 9 8 4 2
do
        echo $i
done
# 键盘输入
for i in $*
do
        echo $i
done
# 不能识别位置变量
for i in {$1..$2}
do
        echo $i
done
# 也不能识别自定义变量
num1=3
num2=9
for i in {$num1..$num2}
do
        echo $i
done
# 使用变量的遍历方法
read -p "input num1: " num1
read -p "input num2: " num2
for ((i=$num1;i<=$num2;i++))
do
        echo $i
done
# 遍历数组,直接遍历值
arr=(1 2 3 4 5 6 9)
for i in ${arr[*]}
do
        echo $i
done
# 通过数组索引遍历值    ${!arr[*]}获取索引
arr=([1]=2 [3]=4 [5]=6 [7]=8 )
for i in ${!arr[*]}
do
        echo "索引$i,对应的值${arr[$i]}"
done

# 通过数组长度遍历
arr=(1 3 5 7 9)
for ((i=0;i<${#arr[*]};i++))
do
        echo ${arr[$i]}
done
# 倒序输出
for ((i=${#arr[*]}-1;i>=0;i--))
do
        echo ${arr[$i]}
done
# 数组冒泡排序
arr=(3 5 1 9 7 6 2 8 4)
for ((i=0;i<${#arr[*]}-1;i++))
do
       for ((j=0;j<${#arr[*]}-1;j++))
       do
               if [ ${arr[$j]} -gt ${arr[$j+1]} ]
               then
                       t=${arr[$j]}
                       arr[$j]=${arr[$j+1]}
                       arr[$j+1]=$t
               fi
       done
done
for ((i=0;i<${#arr[*]};i++))
do
       echo ${arr[$i]}
done
# 乘法口诀表
for ((i=1;i<=9;i++))
do
       for ((j=1;j<=i;j++))
       do
               printf "%d*%d=%2d\t" $i $j $((i * j))
       done
       echo ""
done
# 批量测试主机
# 文件中存放需要测试的主机地址
ips=$(cat hosts.txt)
for ip in $ips
do
       ping $ip -c 4 -i 0.2 &>/dev/null
       if [ $? -eq 0 ]
       then
               echo "$ip is up" >> up.txt
       else
               echo "$ip is down" >> down.txt
       fi
done
# 批量创建用户
for i in {1..3}
do
       useradd -m -s /bin/bash user$i
done
# 批量删除用户
for i in {1..3}
do
       userdel -r user$i
done
# 只拷贝文件
path=$(ls /test/test1)
for i in $path
do
       if [ -f /test/test1/$i ]
       then
               cp /test/test1/$i /test/test2
               echo "$i copy success"
       fi
done

2 while循环

for 循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。

对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另外一种循环——while 语句。

  • 语法

while 条件测试语句
do
命令序列
done

  • 示例
i=1
while [ $i -lt 10 ]
do
       echo "$i"
       let i++
done
# 创建用户
i=1
while [ $i -le 3 ]
do
        username=user$i
        # 判断用户是否存在
        if id "$username" &>/dev/null
        then
                echo "用户 $username 已存在"
        # 若用户不存在,则创建用户
        else
                useradd -m -s /bin/bash $username
                # chpasswd:为用户设置密码
                echo "$username:666" | chpasswd
        fi
        let i++
done
# 删除用户
i=1
while [ $i -le 3 ]
do
        userdel -r user$i &>/dev/null
        echo "用户 user$i 已删除"
        let i++
done

3 intil循环

until循环在条件为假时执行循环

  • 语法

until 条件测试语句
do
命令序列
done

  • until 语句的执行流程

首先判断 until 后的条件测试操作结果,如果条件不成立,则执行 do…done 循环体中的命令序列。
返回 until 后再次判断条件测试结果,如果条件仍然不成立,则继续执行循环体。
如此循环,直到 until后的条件测试结果成立为止,最后跳转到 done 语句,表示结束循环。

  • 示例
# 求和
i=1
sum=0
until [ $i -eq 10 ]
do
        let sum=$sum+$i
        let i++
done
echo $sum

网站公告

今日签到

点亮在社区的每一天
去签到