Shell脚本流程控制语句for循环详解

与while和until循环不同,for循环能够在循环期间处理序列,这使其在编程时颇有用处,因此也成为Bash脚本编程中常用构件。


1.for的传统形式

for variable [in words]; do
	commands
done

其中,variable是在循环期间递增的变量名,words是一个可选的条目列表,各个条目会被依次赋给variable,command是在每次循环迭代时要执行的命令。
for在命令行中也可以发挥作用

[sysadmin@ansible ~]$ for i in A B C D; do echo $i; done
A
B
C
D
[sysadmin@ansible ~]$

for真正的强大之处在于创建单词列表的多种方式,

  1. 使用花括号扩展来创建
[sysadmin@ansible ~]$ for i in {A..D}; do echo $i; done
A
B
C
D
  1. 使用路径名扩展来创建
[sysadmin@ansible bin]$ for i in distros*.txt; do echo "$i"; done
distros1.txt
distros2.txt
distros3.txt
distros4.txt
distros5.txt
distros.txt

默认情况下,如果路径名扩展未能匹配到任何文件,则返回通配符本身。为了防范这种情况,我们在脚本中加入相应的代码:

[sysadmin@ansible bin]$ cat longest-word
#!/bin/bash

# longest-word: 在文件中查找字符串

while [[ -n "$1" ]]; do
        if [[ -r "$1" ]]; then
                max_word=
                max_len=0
                for i in $(strings "$1"); do
                        len="$(echo -n "$i" |wc -c)"
                        if (( len > max_len )); then
                                max_len="$len"
                                max_word="$i"
                        fi
                done
                echo "$1: '$max_word' ($max_len characters)"
        fi
        shift
done
[sysadmin@ansible bin]$

上述脚本,有一处地方要注意,不同于惯常的实践,这次并没有将命令替换$(strings “$i”)放入双引号中。这是因为我们正是想要对命令替换的结果进行单词分割,以此得到单词列表。如果加上了双引号,得到的就只是一个包含了文件中所有字符串的单个单词。
如果忽略了for命令中可选的in words部分,则默认处理位置参数。按照这种方法修改脚本longest-word:

[sysadmin@ansible bin]$ cat longest-word2
#!/bin/bash

# longest-word: 在文件中查找字符串

for i; do
        if [[ -r "$1" ]]; then
                max_word=
                max_len=0
                for j in $(strings "$i"); do
                        len="$(echo -n "$j" |wc -c)"
                        if (( len > max_len )); then
                                max_len="$len"
                                max_word="$j"
                        fi
                done
                echo "$i: '$max_word' ($max_len characters)"
        fi
done
[sysadmin@ansible bin]$

为什么要用i,每个for循环示例中选用的变量都是i,这是为什么呢?其实除了沿用惯例之外,也没什么特别原因。for可以使用任何有效变量,只不过i是最常用的,然后就是j和k。

1.for的C语言形式

新版本的Bash加入了另一种for形式,其与C语言中的for形式类似。

for (( expression1; expression2; expression3 )); do
	commands
done

其中,expression1、expression2、expression3都是算术表达式,commands是在每次循环时执行的命令。

[sysadmin@ansible bin]$ cat simple_counter
#!/bin/bash

# simple_counter

for (( i=0; i<5; i=i+1 )); do
        echo $i
done
[sysadmin@ansible bin]$ simple_counter
0
1
2
3
4

猜你喜欢

转载自blog.csdn.net/weixin_43770382/article/details/128162717