shell流程控制之for循环

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

循环

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值