Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算,同样也需要进行根据条件进行流程控制,提供了if、for、while、until等语句。
之前我们探讨了if语句,现在我们来探讨for循环语句。
Linux Shell中的for语句十分灵活,格式多样,我们通过实例看看一些常用的格式。
一、数字条件类循环
(一)格式1:C语言风格
csdn @ edu in ~ [22:14:49]
$ ++for (( i=1; i <=10; i++)); do++
for>++echo "$i * 2 = $(expr $i \* 2)";++
for>++done++
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20
csdn @ edu in ~ [22:15:25]
$
![](https://file.jishuzhan.net/article/1720110288319025153/7bed8048c67093ee3e8325659d62e82f.webp)
(二)格式2:in + 完整数列
1.在zsh中
csdn @ edu in ~ [23:22:07] C:127
$ ++for i in 1 2 3 4 5 6 7 8 9 10; do++
for> ++echo "$i * 2 = $(expr $i \* 2)";++
for> ++done++
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20
csdn @ edu in ~ [23:22:44]
$
![](https://file.jishuzhan.net/article/1720110288319025153/63a52cce1b3a14c304a7e6ddbd817f94.webp)
2.在bash中
[csdn ~]$ ++for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i * 2 = $(expr $i \* 2)"; done++
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/3857b91ce284f13d3397fb5eae8862fa.webp)
(三)格式3:使用 in + seq集合
csdn @ edu in ~ [23:27:05]
$ ++for i in $(seq 1 10) ; do++
for> ++echo "$i * 2 = $(expr $i \* 2)";++
for> ++done++
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20
csdn @ edu in ~ [23:28:42]
$
![](https://file.jishuzhan.net/article/1720110288319025153/2163eea4748fb5bb5aaa04c93ed60e01.webp)
(四)格式4:用 in + {..}集合
1.多余空格导致错误
csdn @ edu in ~ [23:36:02]
$ ++for i in {1..10}; do++
zsh: command not found: do
zsh: command not found: do
zsh: command not found: do
zsh: command not found: do
zsh: command not found: do
zsh: command not found: do
zsh: command not found: do
zsh: command not found: do
zsh: command not found: do
zsh: command not found: do
![](https://file.jishuzhan.net/article/1720110288319025153/e0b110ecd5f8656f3c43727769dfdb7c.webp)
导致出错的原因是命令
++for i in {1..10}; do++
中的 }; 和行末的 do 之间多放了几个空格,只需要一个空格就行。
2.正确的格式
csdn @ edu in ~ [23:36:09] C:127
$ ++for i in {1..10}; do++
for> ++echo "$i * 2 = $(expr $i \* 2)";++
for> ++done++
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20
csdn @ edu in ~ [23:36:47]
$
![](https://file.jishuzhan.net/article/1720110288319025153/3f08704a2fdf3d78b97f00fa6cb570d4.webp)
(五)格式5:在awk中应用
csdn @ edu in ~ [22:41:42]
$ ++awk 'BEGIN {for( i=1; i<=10; i++ ) print i "*2=" i*2}'++
1*2=2
2*2=4
3*2=6
4*2=8
5*2=10
6*2=12
7*2=14
8*2=16
9*2=18
10*2=20
csdn @ edu in ~ [22:41:57]
$
![](https://file.jishuzhan.net/article/1720110288319025153/071a2385fd9361ec1367b369270fb94c.webp)
二、字符条件类循环
(一)格式1:in 字符串
1.在bash中有效
[csdn ~]$ ++s="b d 3";for i in $s; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done++
b is a lowercase letter
d is a lowercase letter
3 is not a letter
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/78756693ae5b2998187ea7ef09ef9803.webp)
2.在zsh中无效
[csdn ~]$ exec zsh
csdn @ edu in ~ [14:00:44]
$ ++s="b d 3";for i in $s; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done++
b d 3 is a lowercase letter
csdn @ edu in ~ [14:00:55]
$
![](https://file.jishuzhan.net/article/1720110288319025153/8df20d32179561460b9262d72a903a2b.webp)
(二)格式1:in 字符1 字符2 ...... 字符n
1.在bash中部分有效
csdn @ edu in ~ [14:26:43]
$ ++exec bash++
[csdn ~]$ ++for i in 'b' 'd' '3'; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done++
b is a lowercase letter
d is a lowercase letter
3 is not a letter
[csdn ~]$ ++for i in b d 3; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done++
>
> ++^C++
[csdn ~]++$ for i in 'b d 3'; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done ;++
> ++^C++
[csdn ~]$ ++for i in "b d 3"; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done ;++
> ++^C++
[csdn ~]$ ++for i in "b d 3"; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done++
> ++^C++
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/22caa170288af98ab1868d4aff75f960.webp)
2.在zsh中有效
csdn @ edu in ~ [14:24:52]
$ ++for i in 'b' 'd' '3'; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done++
b is a lowercase letter
d is a lowercase letter
3 is not a letter
csdn @ edu in ~ [14:25:11]
$ ++for i in b d 3; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done++
b is a lowercase letter
d is a lowercase letter
3 is not a letter
csdn @ edu in ~ [14:26:43]
$
![](https://file.jishuzhan.net/article/1720110288319025153/04c2465ac2c75e40a76139de7f3d1b64.webp)
(三)格式3:in {..}
1.在bash中有效
[csdn ~]$ for i in {b..d}; do
> ++if [[ $i > 'a' && $i < 'z' ]]; then++
> ++echo "$i is a letter";++
> ++else++
> ++echo "$i is not a letter";++
> ++fi;++
> ++done++
b is a letter
c is a letter
d is a letter
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/ca3eed7d9f51d73887d114abde4f3be9.webp)
或者
for i in {b..d}; do if [[ $i > 'a' && i \< 'z' \]\]; then echo "i is a letter"; else echo "$i is not a letter"; fi; done
这条命令在csdn的linux学习环境中显示如下:
![](https://file.jishuzhan.net/article/1720110288319025153/eadfb7449f61578ea83ea6defb1c5c79.webp)
2.在zsh中无效
[csdn ~]$ ++exec zsh++
csdn @ edu in ~ [21:58:49]
$ ++for i in {b..d}; do++
for> ++if [[ $i > 'a' && $i < 'z' ]]; then++
for then> ++echo "$i is a letter";++
for then>++else++
for else> ++echo "$i is not a letter";++
for else> ++fi;++
for> ++done++
{b..d} is not a letter
csdn @ edu in ~ [21:59:03]
$
![](https://file.jishuzhan.net/article/1720110288319025153/42d56f1a3d49deb81a257e65946bf4f1.webp)
(四) in [ 字母1,字母n ]
注意: [后面和] 的前面加了空格
1.在bash中
[csdn ~]$ for i in [ b,d ]; do
> if [[ $i > 'a' && $i < 'z' ]]; then
> echo "$i is a letter";
> else
> echo "$i is not a letter";
> fi;
> done
[ is not a letter
b,d is a letter
] is not a letter
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/22043ce4e41e093511f80150aab21ca4.webp)
2.在zsh中
csdn @ edu in ~ [23:08:28]
$ ++for i in [ b,d ]; do++
for>++if [[ $i > 'a' && $i < 'z' ]]; then++
for then>++echo "$i is a letter";++
for then>++else++
for else>++echo "$i is not a letter";++
for else>++fi;++
for>++done++
[ is not a letter
b,d is a letter
] is not a letter
csdn @ edu in ~ [23:12:14]
$
![](https://file.jishuzhan.net/article/1720110288319025153/3e4bed1c020f784f03183fdec42a21ad.webp)
(五) in [ 字母1 , 字母n ]
注意:[ 字母1 , 字母n ] 之间均有空格间隔。
1.在bash中
[csdn ~]$ for i in [ b , d ]; do
> if [[ $i > 'a' && $i < 'z' ]]; then
> echo "$i is a letter";
> else
> echo "$i is not a letter";
> fi;
> done
[ is not a letter
b is a letter
, is not a letter
d is a letter
] is not a letter
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/39bc8c95aaf45c7daed6b4b2e4cb1215.webp)
2.在zsh中
[csdn ~]$ ++exec zsh++
csdn @ edu in ~ [23:08:21]
$ ++for i in [ b , d ]; do++
for> ++if [[ $i > 'a' && $i < 'z' ]]; then++
for then>++echo "$i is a letter";++
for then>++else++
for else>++echo "$i is not a letter";++
for else>++fi;++
for>++done++
[ is not a letter
b is a letter
, is not a letter
d is a letter
] is not a letter
![](https://file.jishuzhan.net/article/1720110288319025153/f5cbf7162ebfabaabedc17b7ba7eeae1.webp)
(六)一些无效的格式
1.in 字母1-字母n
(1)在basth中
csdn @ edu in ~ [22:36:03]
$ ++exec bash++
[csdn ~]$ ++for i in b-d; do++
>++if [[ $i > 'a' && $i < 'z' ]]; then++
> ++echo "$i is a letter";++
> ++else++
>++echo "$i is not a letter";++
>++fi;++
>++done++
b-d is a letter
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/017e837423e81d7fe41cbcdc292ec561.webp)
(2)在zsh中
csdn @ edu in ~ [22:01:51]
$ for i in b-d; do
if [[ $i > 'a' && $i < 'z' ]]; then
echo "$i is a letter";
else
echo "$i is not a letter";
fi;
done
b-d is a letter
csdn @ edu in ~ [22:02:09]
$
![](https://file.jishuzhan.net/article/1720110288319025153/804966dbf43f822674b6b1ebe63901fb.webp)
2. in [字母1-字母n]
(1)在bash中
[csdn ~]$ ++for i in [b-d]; do++
> ++if [[ $i > 'a' && $i < 'z' ]]; then++
>++echo "$i is a letter";++
> ++else++
> ++echo "$i is not a letter";++
> ++fi;++
> ++done++
[b-d] is a letter
![](https://file.jishuzhan.net/article/1720110288319025153/09152312a40769ec5e2754909dce9234.webp)
(2)在zsh中
csdn @ edu in ~ [22:25:27]
$ ++for i in [b-d]; do++
for>++if [[ $i > 'a' && $i < 'z' ]]; then++
for then>++echo "$i is a letter";++
for then> else
for else> ++echo "$i is not a letter";++
for else> ++fi;++
for>++done++
zsh: no matches found: [b-d]
csdn @ edu in ~ [22:28:11]
$
![](https://file.jishuzhan.net/article/1720110288319025153/65698c9d5ef71a36585661020cd0cb73.webp)
3. in [字母1,字母n]
(1)在bash中
[csdn ~]$ for i in [b,d]; do
> if [[ $i > 'a' && $i < 'z' ]]; then
> echo "$i is a letter";
> else
> echo "$i is not a letter";
> fi;
> done
[b,d] is a letter
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/6e1710ec35f9e79b922077ab84fa405c.webp)
(2)在zsh中
csdn @ edu in ~ [22:29:14]
$++for i in [b,d]; do++
for>++if [[ $i > 'a' && $i < 'z' ]]; then++
for then> ++echo "$i is a letter";++
for then>++else++
for else> ++echo "$i is not a letter";++
for else>++fi;++
for>++done++
zsh: no matches found: [b,d]
csdn @ edu in ~ [22:33:29]
$
![](https://file.jishuzhan.net/article/1720110288319025153/d8d045069fd57092ef1369d875a92bf6.webp)
4. in '字母1-字母n'
(1)在bash中
[csdn ~]$ ++for i in 'b-d'; do++
>++if [[ $i > 'a' && $i < 'z' ]]; then++
> ++echo "$i is a letter";++
> ++else++
>++echo "$i is not a letter";++
>++fi;++
>++done++
b-d is a letter
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/5c1774bc601e61fd781017a4212abbe8.webp)
(2)在zsh中
csdn @ edu in ~ [22:33:29]
$++for i in 'b-d'; do++
for>++if [[ $i > 'a' && $i < 'z' ]]; then++
for then>++echo "$i is a letter";++
for then>++else++
for else>++echo "$i is not a letter";++
for else>++fi;++
for>++done++
b-d is a letter
csdn @ edu in ~ [22:36:03]
$
![](https://file.jishuzhan.net/article/1720110288319025153/391a1f92c3ba08533f51b42f5d300a65.webp)
5. in '字母1'-'字母n'
(1)在bash中
[csdn ~]$ ++for i in 'b'-'d'; do++
> ++if [[ $i > 'a' && $i < 'z' ]]; then++
>++echo "$i is a letter";++
> ++else++
> ++echo "$i is not a letter";++
>++fi;++
>++done++
b-d is a letter
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/69042a7163353d27e85b7210bbc1a4a2.webp)
(2)在zsh中
csdn @ edu in ~ [22:46:27]
$ ++for i in 'b'-'d'; do++
for> ++if [[ $i > 'a' && $i < 'z' ]]; then++
for then> ++echo "$i is a letter";++
for then>++else++
for else>++echo "$i is not a letter";++
for else> ++fi;++
for>++done++
b-d is a letter
csdn @ edu in ~ [22:46:35]
$
![](https://file.jishuzhan.net/article/1720110288319025153/8e637d292a423a8b6eaf21fdb21d54f5.webp)
6.in ['字母1'-'字母n']
(1)在bash中
csdn @ edu in ~ [22:51:56]
$ ++exec bash++
[csdn ~]$ ++for i in ['b'-'d']; do++
>++if [[ $i > 'a' && $i < 'z' ]]; then++
>++echo "$i is a letter";++
>++else++
> ++echo "$i is not a letter";++
>++fi;++
>++done++
[b-d] is a letter
[csdn ~]$
![](https://file.jishuzhan.net/article/1720110288319025153/4e76911fb0e17a92acf758e5f8789099.webp)
(2)在zsh中
csdn @ edu in ~ [22:51:06]
$ ++for i in ['b'-'d']; do++
for>++if [[ $i > 'a' && $i < 'z' ]]; then++
for then>++echo "$i is a letter";++
for then>++else++
for else>++echo "$i is not a letter";++
for else>++fi;++
for>++done++
zsh: no matches found: [b-d]
csdn @ edu in ~ [22:51:56]
$
![](https://file.jishuzhan.net/article/1720110288319025153/773f6cdbb96353cdee36d76f4e1fba88.webp)
三、文件和目录类循环操作
(一)实例1:列出根目录/下的内容,判断其是文件还是目录并输出
csdn @ edu in ~ [11:39:57] C:1
$ ++cd /++
csdn @ edu in / [11:40:01]
$ ++ls++
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
csdn @ edu in / [11:40:04]
$ ++for i in `ls`; do if [ -f $i ]; then echo $i is a file\! ; elif [ -d $i ]; then echo $i is a directory\! ; else echo $i is other file\!; fi; done++
anaconda-post.log is a file!
bin is a directory!
dev is a directory!
etc is a directory!
home is a directory!
lib is a directory!
lib64 is a directory!
media is a directory!
mnt is a directory!
opt is a directory!
proc is a directory!
root is a directory!
run is a directory!
sbin is a directory!
srv is a directory!
sys is a directory!
tmp is a directory!
usr is a directory!
var is a directory!
csdn @ edu in / [11:43:15]
$
![](https://file.jishuzhan.net/article/1720110288319025153/6cd4b72e999631b0c307f6a01e92e79c.webp)
我们使用 cd / 命令让根目录/变成当前目录,然后用引用符(Esc键下面的`) 将ls命令获取的根目录/内容作为循环变量用if语句进行判断处理:
用 -f判断是否为文件,如果是文件就输出文件名称并注明is a file
否则用 -d判断是否为目录 ,如果是目录就输出目录名称并注明is a directory
否则就输出文件名称并注明is other file
需要注意的是,我们用引用符(Esc键下面的`) 来引有ls命令获取的根目录/内容。
(二)列出当前目录下的.sh文件名并输出提示is a shell script file !
csdn @ edu in ~ [14:03:58]
$ ++ls *.sh++
zsh: no matches found: *.sh
csdn @ edu in ~ [14:05:37] C:1
$ ++echo "hello" > hello.sh++
csdn @ edu in ~ [14:05:55]
$ ++cat hello.sh++
hello
csdn @ edu in ~ [14:06:02]
$ ++for f in $(ls *.sh);do echo $f is a shell script file \! ; done++
hello.sh is a shell script file !
csdn @ edu in ~ [14:07:16]
$
![](https://file.jishuzhan.net/article/1720110288319025153/6154ab7c2db475215c43b39e19215b2e.webp)
在上面的实例中,我们先用ls命令检查,发现当前目录下没有.sh文件
接着我们用for语句列出当前目录下的.sh文件名,并输出提示is a shell script file !
这里我们同样是引入了ls命令执行的结果,但引用的方法跟 (一)实例1:列出根目录/下的内容,判断其是文件还是目录并输出里不同,大家可以对比一下这两种方法 。