Bash 中的 for 循环是重要的控制结构,用于脚本编写重复任务。它们提供多次执行一系列命令、循环范围、变量、命令输出等的能力。
这个综合教程将带您了解在 Bash 中使用 for 循环的各种方法。
从基本语法到更高级的主题,例如嵌套循环和动态序列生成。
基本语法
Bash 中的 for 循环通常遵循以下语法:
for VARIABLE in ELEMENT_1 ELEMENT_2 ... ELEMENT_N
do
COMMAND1
COMMAND2
...
done
在这里,循环迭代元素并执行之间包含的命令do
and done
.
现在,如果您运行这个简单的示例:
for i in 1 2 3
do
echo $i
done
Output:
1
2
3
在此代码中,循环迭代 3 次,设置变量i
每次迭代中分别为值 1、2 和 3。然后它打印的值i
,产生上述输出。
迭代数字序列
在 Linux Bash 中,您可以轻松地迭代数字序列。就是这样:
for number in {1..5}
do
echo $number
done
Output:
1
2
3
4
5
循环运行五次,变量number
依次取1到5的值。这回显命令逐行打印这些值。
带范围的 For 循环
您可以使用以下语法在 Bash 中创建具有指定范围的循环{START..END..INCREMENT}
。这是一个例子:
for number in {0..10..2}
do
echo $number
done
Output:
0
2
4
6
8
10
此循环以 2 为增量迭代从 0 到 10 的数字。变量number
按顺序分配这些值,并逐行打印它们。
阅读更多内容Bash for 循环范围.
迭代字符串
在 Bash 中迭代字符串非常简单。这是一个例子:
for string in "apple" "banana" "cherry"
do
echo $string
done
Output:
apple
banana
cherry
这里,循环迭代三次,每次为变量分配不同的水果名称string
。因此,它会打印这些水果名称。
迭代命令输出
您可以迭代 Bash 中命令的输出。以下是列出目录中所有文本文件的方法:
for file in $(ls *.txt)
do
echo $file
done
Output:
file1.txt
file2.txt
file3.txt
循环运行ls *.txt
命令并获取目录中所有文本文件的名称。
变量file
然后依次获取每个文件名,并且echo
命令打印它们。
循环文件和目录
以下是列出当前文件夹中所有目录的示例:
for dir in */
do
echo $dir
done
Output:
dir1/
dir2/
dir3/
在这种情况下,循环遍历当前文件夹中的所有目录,由尾部斜杠表示*/
.
变量dir
依次取每个目录名的值,然后echo
命令打印它们。
阅读更多关于如何Linux 中使用 for 循环迭代文件.
循环控制语句
循环控制语句有助于控制循环内的流程。
break
终止循环。例子:
for number in {1..5}
do
if [ $number -eq 3 ]; then
break
fi
echo $number
done
Output:
1
2
循环退出时number
等于 3,导致仅打印 1 和 2。
continue
跳到下一次迭代。例子:
for number in {1..5}
do
if [ $number -eq 3 ]; then
continue
fi
echo $number
done
Output:
1
2
4
5
循环跳过打印 3 并继续打印其他数字。
exit
退出整个脚本。例子:
for number in {1..5}
do
if [ $number -eq 3 ]; then
exit
fi
echo $number
done
Output:
1
2
整个脚本终止时number
等于 3,并且不再执行任何代码。
嵌套 For 循环
嵌套 for 循环由另一个循环中的一个或多个循环组成。下面是一个使用两个嵌套循环创建乘法表的示例:
for i in {1..3}
do
for j in {1..3}
do
echo -n "$((i * j)) "
done
echo
done
Output:
1 2 3
2 4 6
3 6 9
这里,外循环迭代数字 1 到 3,内循环也做同样的事情。
在内循环内部,变量的乘积i
and j
打印出来,创建一个 3×3 乘法表。
动态生成循环序列(使用 seq)
您可以使用顺序命令动态生成 for 循环序列。这是一个例子:
for number in $(seq 1 2 9)
do
echo $number
done
Output:
1
3
5
7
9
在这里,seq 1 2 9
命令生成从 1 到 9 的数字序列,递增 2。
循环迭代这些数字,逐行打印它们。
无限 Bash for 循环
无限循环无限期地继续,没有终止条件。这是一个简单的例子:
for (( ; ; ))
do
echo "This is an infinite loop."
sleep 1
done
Output:
This is an infinite loop.
This is an infinite loop.
...
何时使用无限循环:无限循环对于需要继续而不停止的任务非常有用,例如监视系统进程或等待特定事件。
如何阻止它:要停止无限循环,可以使用终止命令,如 CTRL+C。
必须谨慎使用无限循环,因为如果管理不当,它们可能会消耗系统资源。
C-Style
Bash 支持 C 风格的 for 循环,为熟悉 C 编程的人提供了熟悉的语法。下面是一个示例:
for (( i=0; i<3; i++ ))
do
echo "Iteration number $i"
done
Output:
Iteration number 0
Iteration number 1
Iteration number 2
这个循环开始于i
设置为 0 并继续i
小于 3,递增i
每次迭代时加 1。它打印每个值的迭代次数i
.
Using $@
& $*
在巴什中,$@
and $*
是处理命令行参数的特殊变量,它们可以在循环中使用。就是这样:
for arg in "$@"
do
echo $arg
done
输出(如果使用以下命令调用脚本./script.sh one two three
):
one
two
three
$@
将每个参数视为一个单独的单词,循环将它们一一打印。
Using $*
:
for arg in "$*"
do
echo $arg
done
输出(如果使用以下命令调用脚本./script.sh one two three
):
one two three
$*
将所有参数视为单个字符串,因此循环将它们打印在一行上。