循环
for循环:
在编程语言中,我们会涉及许多重复使用的代码块,为了简化代码,方便使用,就会使用循环语句来实现,重复代码的调用。
shell中for循环有三种使用方法:
(1)带列表的for循环
(2)不带列表的for循环
(3)类似C风格的for循环
1.带列表的for循环
**使用范围:**通常用于已知循环次数的for循环:
其语法是:
for 循环变量 in {list(列表)}
do
statement1
statement2
...
done
注:
list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开。do和done之间的所有的语句称为循环体,既循环结构中重复执行的语句。for循环体的执行次数与list中元素的个数有关。在带列表的for语句的执行时,shell会将in关键字后面的list列表的第一个元素的值赋给(循环变量),然后执行循环体;当循环体中的语句执行完毕后,shell会将列表中的第二个元素的值赋给(循环变量),然后再次执行循环体,当list列表中的所有元素都被遍历一遍之后,for循环结构终止,程序将继续执行done语句后面的其他语句。
示例:
示例一
#! /bin/bash
for IP in 192.168.150.100 192.168.150.101
do
echo $IP
done
结果:
[root@bogon ~]# vim for1.sh
[root@bogon ~]# chmod +x for1.sh
[root@bogon ~]# ./for1.sh
192.168.150.100
192.168.150.101
示例二
使用不同的格式实现上例:
#! /bin/bash
for IP in $(seq -f "192.168.150.10%1g" 1 9)
do
echo $IP
done
结果:
[root@bogon ~]# vim for3.sh
[root@bogon ~]# chmod +x for3.sh
[root@bogon ~]# ./for2.sh
192.168.150.101
192.168.150.102
192.168.150.103
192.168.150.104
192.168.150.105
192.168.150.106
192.168.150.107
192.168.150.108
192.168.150.109
示例三
使用不同的格式实现上例:
#! /bin/bash
for IP in 192.168.150.10{1..9}
do
echo $IP
done
结果:
[root@bogon ~]# vim for2.sh
[root@bogon ~]# chmod +x for2.sh
[root@bogon ~]# ./for2.sh
192.168.150.101
192.168.150.102
192.168.150.103
192.168.150.104
192.168.150.105
192.168.150.106
192.168.150.107
192.168.150.108
192.168.150.109
案例四
#! /bin/bash
#获取当前目录下的文件名作为变量列表打印输出
for file_name in $(ls -F | grep -v /$)
#使用ls -F | grep -v /$ 过滤除了目录以外的文件
do
echo $file_name
done
结果:
[root@bogon ~]# vim for4.sh
[root@bogon ~]# chmod +x for4.sh
[root@bogon ~]# ./for4.sh
anaconda-ks.cfg
a.txt
big.sh
case1.sh
case2.sh
case3.sh
case4.sh
ceshi1.sh
ceshi2.sh
ceshi4.sh
chen1.sh
chen2.sh
chen.sh
chen.txt
2不带列表的for循环语句
在某些请况下,for循环的条件列表可以完全省略,称为不带列表的for循环语句。如果没有循环列表,shell将从命令行获取条件列表。
语法规范:
for 循环变量
do
statement1
statement2
...
done
在shell中有一系统变量$@可以获取所有的参数,故上述语法等价于以下:
for 循环变量 in $@
do
statement1
statement2
...
done
示例
#! /bin/bash
for var
do
echo $var
done
结果:
[root@bogon ~]# vim for5.sh
[root@bogon ~]# chmod +x for5.sh
[root@bogon ~]# ./for5.sh
[root@bogon ~]# ./for5.sh {1..9}
1
2
3
4
5
6
7
8
9
3.类似C风格的for循环语句
语法规范
for ((expression1;expression2;expression3))
done
statement1
statement2
...
done
**解读:**上述语法中,先写for 关键字,然后用空格隔开再使用双括号将for循环语句的条件括起来。
执行条件分为三个部分:
(1)expression1:通常是条件变量初始化的语句;
(2)expression2:通常是决定是否执行for循环的条件;
- 当expression2的值为真时(返回码为0)执行for循环,当expression2的值为假时(返回码为非0)不执行for循环。
(3)expression3:通常是用来改变条件变量的值,如递增或递减。
案例一
#! /bin/bash
#批量创建用户:
#要求:(1)用户名以user开头,按数字序号变化
#(2)一共添加三十个用户,既user01...user30
#(3)用户初始化密码为123
#分析: (1)根据要求使用循环完成
#(2)创建用户使用useradd,10以下的用户前面需要加0
#(3)设置密码echo 123 | passwd --stdin username
for ((i=1;i<=30;i++))
do
if [ $i -lt 10 ]
then
user=user0$i
else
user=user$i
fi
if ! id -u $user &>/dev/null
then
useradd $user
echo 123 | passwd --stdin $user &>/dev/null
else
echo "此用户已存在"
fi
done
结果:
[root@bogon ~]# for i in user0{1..9}
> do
> var=$(id $i)
> echo $var
> done
uid=1000(user01) gid=1000(user01) 组=1000(user01)
uid=1001(user02) gid=1001(user02) 组=1001(user02)
uid=1002(user03) gid=1002(user03) 组=1002(user03)
uid=1003(user04) gid=1003(user04) 组=1003(user04)
uid=1004(user05) gid=1004(user05) 组=1004(user05)
uid=1005(user06) gid=1005(user06) 组=1005(user06)
uid=1006(user07) gid=1006(user07) 组=1006(user07)
uid=1007(user08) gid=1007(user08) 组=1007(user08)
uid=1008(user09) gid=1008(user09) 组=1008(user09)
[root@bogon ~]# for i in user1{0..9}; do var=$(id $i); echo $var; done
uid=1009(user10) gid=1009(user10) 组=1009(user10)
uid=1010(user11) gid=1010(user11) 组=1010(user11)
uid=1011(user12) gid=1011(user12) 组=1011(user12)
uid=1012(user13) gid=1012(user13) 组=1012(user13)
uid=1013(user14) gid=1013(user14) 组=1013(user14)
uid=1014(user15) gid=1014(user15) 组=1014(user15)
uid=1015(user16) gid=1015(user16) 组=1015(user16)
uid=1016(user17) gid=1016(user17) 组=1016(user17)
uid=1017(user18) gid=1017(user18) 组=1017(user18)
uid=1018(user19) gid=1018(user19) 组=1018(user19)
[root@bogon ~]# for i in user2{0..9}; do var=$(id $i); echo $var; done
uid=1019(user20) gid=1019(user20) 组=1019(user20)
uid=1020(user21) gid=1020(user21) 组=1020(user21)
uid=1021(user22) gid=1021(user22) 组=1021(user22)
uid=1022(user23) gid=1022(user23) 组=1022(user23)
uid=1023(user24) gid=1023(user24) 组=1023(user24)
uid=1024(user25) gid=1024(user25) 组=1024(user25)
uid=1025(user26) gid=1025(user26) 组=1025(user26)
uid=1026(user27) gid=1026(user27) 组=1026(user27)
uid=1027(user28) gid=1027(user28) 组=1027(user28)
uid=1028(user29) gid=1028(user29) 组=1028(user29)
案例二
#! /bin/bash
#删除上述脚本创建的用户(user01-user30)
for ((i=1;i<=30;i++))
do
if [ $i -lt 10 ]
then
user=user0$i
else
user=user$i
fi
id $user &>/dev/null && userdel -r $user
done
[root@bogon ~]# vim for7.sh
[root@bogon ~]# chmod +x for7.sh
[root@bogon ~]# ./for7.sh
[root@bogon ~]# for i in user0{1..9}
> do
> var=$(id $i)
> echo $var
> done
id: “user01”:无此用户
id: “user02”:无此用户
id: “user03”:无此用户
id: “user04”:无此用户
id: “user05”:无此用户
id: “user06”:无此用户
id: “user07”:无此用户
id: “user08”:无此用户
id: “user09”:无此用户
上述代码也可写成如下所示:
#! /bin/bash
#删除上述脚本创建的用户(user01-user30)
for ((i=1;i<=30;i++))
do
if [ $i -lt 10 ]
then
user=user0$i
else
user=user$i
fi
if id $user &>/dev/null
then
userdel -r $user
else
echo "该用户不存在"
fi
done

本文详细介绍了Shell中for循环的三种用法:带列表的for循环、不带列表的for循环和类似C风格的for循环。通过多个示例展示了如何在不同场景下运用这些循环结构,并解释了其工作原理。
1万+

被折叠的 条评论
为什么被折叠?



