举例说明BASH循环

199 阅读2分钟

循环在任何编程语言中都被用来重复执行相同的代码。三种类型的循环在编程中主要用于完成重复性任务。它们是for, while, 和do-while/repeat-until循环。你可以在bash脚本中以各种方式应用for循环。这篇文章中提到了一些有用的BASH循环的例子。

for 循环的语法

A. for value in list
do
    commands
done

B. for value in file1 file2 file3
do
    commands
done

C. for value in $(Linux command)
do
    commands
done

D. for (( i=0; i<10; i++)
do
    commands
done

根据上述语法,for 循环的开始和结束块由bash脚本中的dodone 关键字定义。本教程的下一部分将介绍不同循环的用途。

例1:读取静态值

创建一个名为loop1.sh的bash文件,其脚本如下:使用for循环从一个列表中读取数值。在这个例子中,5个静态值被声明在列表中。这个循环将迭代5次,每次都会从列表中接收一个值,并将其存储在名为color的变量中,在循环中打印出来。

#!/bin/bash
# Define loop to read string values
for color in Blue Green Pink White Red
do
    # Print the string value
    echo "Color = $color"
done

输出
执行上述脚本后会出现以下输出。

例2: 读取数组变量

你可以使用for循环来遍历一个数组的值.创建一个名为loop2.sh的新bash文件,其脚本如下。在这个例子中,循环从一个名为ColorList的数组变量中获取数值,只有在数组元素中找到粉红色 的数值时,它才会打印输出。

#!/bin/bash
# Declare and array
ColorList=("Blue Green Pink White Red")
# Define loop to  iterate the array values
for color in $ColorList
do
    # Check the value is pink or not
    if [ $color == 'Pink' ]
    then
            echo "My favorite color is $color"
    fi
done

输出

在执行上述脚本后,将出现以下输出。

例3:读取命令行参数

命令行参数值可以通过在bash中使用for loop进行迭代。创建一个新的名为loop3.sh的bash文件,用下面的脚本来读取和打印命令行参数值,使用for循环。

#!/bin/bash
# Define loop to read argument values
for myval in $*
do
    # Print each argument
    echo "Argument: $myval"
done

输出

在执行上述脚本之后,将出现以下输出。这里给出了两个参数作为命令行参数。它们是 "Linux"和 "Hint"。

例4:用三个表达式寻找奇数和偶数

C风格的for循环的语法是三个表达式的语法。第一个表达式表示初始化,第二个表达式表示终止条件,第三个表达式表示递增或递减。创建一个名为loop4.sh的bash文件,其脚本如下,以找出1到5的奇数和偶数。

#!/bin/bash

# Define for loop in C-style format
for (( n=1; n<=5; n++ ))
do  
    # Check the number is even or not
    if (( $n%2==0 ))
    then
        echo "$n is even"
    else
        echo "$n is odd"
    fi  
done

输出

执行上述脚本后会出现以下输出。

例5:读取文件内容

你可以通过使用'cat'命令,用for循环来读取任何文件的内容。假设你有一个名为'weekday.txt'的文件,其中包含所有工作日的名称。现在,创建一个名为loop5.sh的bash文件来读取并打印该文件的内容。

#!/bin/bash
# Initialize the counter
i=1
# Define for loop to read the text file
for var in `cat weekday.txt`
do
    # Print the file content
    echo "Weekday $i: $var"
    ((i++))
done

输出

执行上述脚本后,将出现以下输出。

例6: 创建无限的for循环

用下面的脚本创建一个名为loop6.bash的bash,以了解声明无限for循环的方法。在这里,这个循环将无限次地迭代,并打印计数器的值,直到用户按下Ctrl+C。

#!/bin/bash
# Initialize counter variable
counter=1
# Display message for termination
echo "Press Ctrl+c to terminate from the loop"
# Define infinite loop
for (( ;; ))
do
   # Print the number of iteration
   echo "Iterating for $counter time(s)."
   # Wait for 1 second
   sleep 1
   # Increment the counter
   ((counter++))
done

输出

在执行完上述脚本后会出现以下输出。

例7: 用命令替代for循环的使用

创建一个名为loop7.bash的bash文件, 用下面的脚本来了解使用for循环来读取和打印命令输出的情况。

#!/bin/bash
echo "All bash files starting with 'a' are:"

# Read the output of command substitute using for loop
for val in $(ls a*.bash)
do
    # Print the file name
    echo "$val"
done

输出

在执行完上述脚本后会出现以下输出。

例8: 使用break的条件性退出

创建一个名为loop8.bash的bash文件, 用下面的脚本来了解根据任何特定条件退出循环的方式。

#!/bin/bash
# Define a for loop to iterate 10 times
for (( i=1; i<=10; i++ ))
do  
    # Define the conditions to terminate the loop
    if (( $i%3==0 && $i%6==0 ))
    then
        # Terminate from the loop
        echo "Terminated."
        break
    else
        # Print the current value of i
        echo "The current value of i is: $i"
    fi  
done

输出

在执行完上面的脚本后会出现下面的输出。

例9: 使用continue语句的早期继续

创建一个名为loop8.bash的bash文件,其脚本如下,以了解如何根据特定条件使用继续语句从循环中省略一个或多个语句。

#!/bin/bash
# Declare an associative array
declare -A Applicants
# Intialize the array values
Applicants=( [1022]="Present" [1034]="Present" [1045]="Absent" [1067]="Present" )

echo "List of the applicant's ID who are present:"
for k in ${!Applicants[@]}
do
     # Filter the applicant's ID who are absent
     if [ ${Applicants[$k]} == "Absent" ]; then
        continue
     else
        # Print the applicant's ID who are present
        echo $k
     fi
done

输出

执行上述脚本后会出现以下输出。

总结

本教程通过各种例子解释了for循环的不同用途,以帮助bash用户了解正确使用for循环的目的,并将其应用于他们的脚本。