for
循环、while
循环和until
循环。在像Bash这样的脚本语言中,循环对于自动化重复性任务非常有用,消除了重复编写相同代码的需要。
文章目录
for
循环for
循环遍历一个项目列表并执行给定的命令集。Bash for
循环采用以下形式:for item in [列表]
do
[命令]
done
列表可以是一系列由空格分隔的字符串、数字范围、命令的输出、数组、从命令行传递的参数等。
element
存储循环当前正在操作的项目。for element in Hydrogen Helium Lithium Beryllium
do
echo "元素:$element"
done
循环将产生以下输出:
元素:Hydrogen
元素:Helium
元素:Lithium
元素:Beryllium
您可以使用序列表达式通过定义范围的起始点和结束点来指定数字或字符的范围。序列表达式采用以下形式:
这里是一个示例循环,它遍历从0到3的所有数字:
for i in {0..3}
do
echo "数字:$i"
done
数字:0
数字:1
数字:2
数字:3
从Bash 4开始,使用范围时还可以指定增量。表达式采用以下形式:
这里是一个示例,展示了如何以5为增量:
for i in {0..20..5}
do
echo "数字:$i"
done
数字:0
数字:5
数字:10
数字:15
数字:20
for
循环来遍历数组中的元素。在下面的示例中,我们定义了一个名为BOOKS
的数组,并遍历数组的每个元素。BOOKS=('追寻逝去的时光' '堂吉诃德' '尤利西斯' '了不起的盖茨比')
for book in "${BOOKS[@]}"
do
echo "书籍:$book"
done
书籍:追寻逝去的时光
书籍:堂吉诃德
书籍:尤利西斯
书籍:了不起的盖茨比
for
循环for
循环的语法采用以下形式:for ((初始化;测试;步进))
do
[命令]
done
初始化
部分仅在循环开始时执行一次。然后,评估测试
部分。如果为假,则终止循环。如果测试
为真,则执行for
循环体内的命令,并更新步进
部分。在以下示例代码中,循环首先通过初始化i = 0
开始,在每次迭代之前检查i ≤ 10
。如果为真,则打印当前的i
值,并增加变量i
的值1(i++
)。否则,循环终止。for ((i = 0 ; i <= 1000 ; i++)); do
echo "计数器:$i"
done
循环将迭代1001次,并产生以下输出:
计数器:0
计数器:1
计数器:2
...
计数器:998
计数器:999
计数器:1000
嵌套循环是另一个循环内的循环。您可以嵌套任何循环任何次数。
在嵌套的for
循环中,内部循环为每个外部循环迭代运行一个完整的迭代周期。这意味着对于外部循环的每次执行,内部循环将执行其所有迭代,直到外部循环完成其周期。以下是一个示例代码,将三个文件逐个复制到三台服务器。
for f in file_{1..3}; do
for j in server_{1..3}; do
echo "正在将文件 $f 复制到服务器 $j";
# 复制文件的命令
done;
done
正在将文件 file_1 复制到服务器 server_1
正在将文件 file_1 复制到服务器 server_2
正在将文件 file_1 复制到服务器 server_3
正在将文件 file_2 复制到服务器 server_1
正在将文件 file_2 复制到服务器 server_2
正在将文件 file_2 复制到服务器 server_3
正在将文件 file_3 复制到服务器 server_1
正在将文件 file_3 复制到服务器 server_2
正在将文件 file_3 复制到服务器 server_3
break
和continue
语句break
和continue
语句可用于控制for
循环的执行。break
语句break
语句终止当前循环,并将程序控制权传递给终止语句之后的语句。它通常用于在满足特定条件时终止循环。在以下示例中,我们使用if
语句在当前迭代项目等于‘Lithium’时终止循环的执行。for element in Hydrogen Helium Lithium Beryllium; do
if [[ "$element" == 'Lithium' ]]; then
break
fi
echo "元素:$element"
done
echo '全部完成!'
元素:Hydrogen
元素:Helium
全部完成!
continue
语句continue
语句退出循环的当前迭代,并将程序控制权传递给循环的下一个迭代。在以下示例中,我们正在遍历一系列数字。当当前迭代项目等于‘2’时,continue
语句将导致执行返回到循环的开头,并继续下一个迭代:for i in {1..5}; do
if [[ "$i" == '2' ]]; then
continue
fi
echo "数字:$i"
done
数字:1
数字:3
数字:4
数字:5
for
示例以下示例展示了如何通过将空格替换为下划线来重命名当前目录中所有文件名中带有空格的文件:
for file in * *; do
mv "$file" "${file// /_}"
done
让我们逐行分解代码:
for
循环,并遍历了当前目录中所有文件名中带有空格的文件列表。表达式* *
创建了列表。_
)替换空格。${file// /_}
部分使用了shell参数扩展来替换参数中的模式为字符串。done
表示循环段的结束。for
循环将当前目录中所有以.jpeg结尾的文件的文件扩展名从.jpeg更改为.jpg。for file in *.jpeg; do
mv -- "$file" "${file%.jpeg}.jpg"
done
让我们逐行分析代码:
for
循环,并遍历了所有以‘.jpeg’结尾的文件列表。${file%.jpeg}
使用shell参数扩展从文件名中移除‘.jpeg’部分。done
表示循环段的结束。for
循环用于重复执行一组给定的命令固定次数。