Shell编程 - 循环篇

1. for 循环

for 循环是用于遍历一个序列(如列表、字符串、元组等)的循环结构。它会依次取出序列中的每个元素,执行循环体中的代码。

格式

for 变量名 in 序列; do
    命令
done

示例

示例 1:遍历数字序列

#!/bin/bash
for i in {1..3}; do
    echo $i
done
# 输出:
# 1
# 2
# 3

示例 2:遍历位置参数

#!/bin/bash
for i in "$@"; do    # $@ 是将位置参数作为单个来处理
    echo $i
done
# 调用方式:bash test.sh 1 2 3
# 输出:
# 1
# 2
# 3

示例 3:遍历文件内容

#!/bin/bash
for line in $(cat a.txt); do
    echo $line
done
# 假设 a.txt 内容为:
# a b c
# 1 2 3
# x y z
# 输出:
# a
# b
# c
# 1
# 2
# 3
# x
# y
# z

C语言风格

for (( 初始化; 条件; 更新 ))
do
    命令1
    命令2
    ...
done

这种形式类似于 C 语言中的 for 循环,适合用于数值范围的迭代。
示例:

for ((i=1; i<=5; i++))
do
    echo "Number: $i"
done
输出:

Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

2. while 循环

while 循环是基于条件判断的循环结构。只要条件为真,循环体就会一直执行。

格式

while 条件表达式; do
    命令
done

示例

示例 1:基于计数的 while 循环

#!/bin/bash
N=0
while [ $N -lt 5 ]; do
    let N++
    echo $N
done
# 输出:
# 1
# 2
# 3
# 4
# 5

示例 2:死循环

#!/bin/bash
while true; do
    echo "yes"
done
# 此循环会一直输出 "yes",直到手动终止

示例 3:逐行读取文件

假设文件 a.txt 内容如下:

a b c
1 2 3
x y z

方式 1:通过管道读取

#!/bin/bash
cat ./a.txt | while read LINE; do
    echo $LINE
done
# 输出:
# a b c
# 1 2 3
# x y z

方式 2:通过重定向读取

#!/bin/bash
while read LINE; do
    echo $LINE
done < ./a.txt
# 输出:
# a b c
# 1 2 3
# x y z

方式 3:通过 exec 读取

#!/bin/bash
exec < ./a.txt  # 读取文件作为标准输入
while read LINE; do
    echo $LINE
done
# 输出:
# a b c
# 1 2 3
# x y z

示例 4:统计 IP 出现次数并进行网络测试

假设文件 ip.txt 内容如下:

10.0.0.61 5
10.0.0.7  6
10.0.0.8  8
baidu.com  10
jd.com  5
#!/bin/bash
# 1. 定义文件路径
src_file=./ip.txt

# 2. 使用 while 读取文件并进行判断
while read ip count; do
    if [ $count -ge 5 ]; then
        ping -c 1 $ip &>/dev/null  # 发送一个 ICMP 请求,将输出重定向到 /dev/null
        if [ $? -eq 0 ]; then
            echo -e "\033[32m$ip 可以访问\033[0m"  # 绿色输出
        else
            echo -e "\033[31m$ip 不可以访问\033[0m"  # 红色输出
        fi
    fi
done < $src_file

3. breakcontinue 语句

breakcontinue 是用于控制循环流程的语句。

break:终止循环

break 语句用于完全终止循环,跳出循环体。

示例 1:在死循环中,满足条件终止循环

#!/bin/bash
N=0
while true; do
    let N++
    if [ $N -eq 5 ]; then
        break  # 当 N 等于 5 时,终止循环
    fi
    echo $N
done
# 输出:
# 1
# 2
# 3
# 4

continue:跳过当前循环

continue 语句用于跳过当前循环的剩余部分,直接进入下一次循环。

示例 2:跳过特定条件的循环

#!/bin/bash
N=0
while [ $N -lt 5 ]; do
    let N++
    if [ $N -eq 3 ]; then
        continue  # 当 N 等于 3 时,跳过当前循环
    fi
    echo $N
done
# 输出:
# 1
# 2
# 4
# 5

总结

  • for 循环:适用于遍历序列(如数字、文件内容等)。
  • while 循环:适用于基于条件判断的循环。
  • breakcontinue:用于控制循环流程,break 终止循环,continue 跳过当前循环。
posted @ 2024-12-01 18:54  kyle_7Qc  阅读(76)  评论(0)    收藏  举报