shell的5种循环结构

12 篇文章 0 订阅

1.步进循环语句for

for循环是最简单,也是最常用的循环语句。for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。
① 带列表的for循环语句
带列表的for循环通常用于将一组语句执行已知的次数,其基本语法如下:

for variable in list
do
statement1
statement2
...
done

在上面的语法中,variable称为循环变量,list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开。do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句。for循环体的执行次数与list中元素的个数有关。在带列表的for语句执行时,Shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体;当循环体中的语句执行完毕之后,Shell会将列表中的第2个元素的值赋给变量variable,然后再次执行循环体。当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句。
示例:

[root@localhost test5]# vim list3.sh
for IP in $(seq -f "192.168.1.10%1g" 1 5)
do
echo $IP
done
[root@localhost test5]# chmod +x list3.sh
[root@localhost test5]# ./list3.sh
192.168.1.101
192.168.1.102
192.168.1.103
192.168.1.104
192.168.1.105
说明:seq的用法如下
[root@localhost test5]# seq -f 'hello%03g' 1 2
hello001
hello002

②不带列表的for循环语句
在某些特殊情况下,for循环的条件列表可以完全省略,称为不带列表的for循环语句。如果没有为for循环提供条件列表,Shell将从命令行获取条件列表。不带列表的for循环语句的一般语法如下:

for variable
do
statement1
statement2
...
done

由于系统变量$@同样可以获取所有的参数,所以以上的语法等价于以下语法:

for variable in $@$*
do
statement1
statement2
...
done

示例:

[root@localhost test5]# vim 1.sh
#!/bin/bash
for arg
do
echo $arg
done
[root@localhost test5]# bash 1.sh {1..6}
1
2
3
4
5
6

③ 类C风格的for循环语句

for ((expression1;expression2;expression3))
do
statement1;
statement2;
...
done

在上面的语法中,for循环语句的执行条件被2个圆括号包括起来。执行条件分为3个部分,由2个分号隔开,第1部分expression1通常是条件变量初始化的语句;第2部分expression2是决定是否执行for循环的条件。expression2的值为0时,执行整个循环体;当expression2的值为非0时,退出for循环体。第3部分,即表达式expression3通常用来改变条件变量的值,例如递增或者递减等。
示例1:批量创建用户:
用户名以test开头,按数字序号变化;
一共添加30个账号,即test01,tes02…,test30
用户初始密码为123456

[root@localhost test5]# vim add_user.sh
#!/bin/bash
for ((i=1;i<=30;i++))
do
if [ $i -lt 10 ]
then
user=test0$i
else
user=test$i
fi
if ! id -u $user &> /dev/null
then
useradd $user
echo "123456" | passwd --stdin $user &> /dev/null
else
echo "$user is exists..."
fi
done
注意:可以简化写法,直接用for带列表的循环,这样就不用for里面嵌套if判断
比如for i in {01..30}

2. while循环语句

while循环语句的基本语法如下:

while expression
do
statement1
statement2
...
done

在上面的语法中,expression表示while循环体执行时需要满足的条件。虽然可以使用任意合法的Shell命令,但是,通常情况下expression代表一个测试表达式,当expression的值为0时才执行循环体中的语句,每次执行到done时就会重新判断while条件表达式是否成立,当expression的值为非0值时,将退出循环体。与其他的循环结构一样,do和done这2个关键字之间的语句构成了循环体。

while循环读取文件

采用exc读取文件,然后进入while循环处理
[root@localhost test5]# cat file
shuju1
shuju2
shuju3
[root@localhost test5]# cat file.sh
#!/bin/bash
exec < file
while read a
do
echo $a
done
[root@localhost test5]# bash file.sh
shuju1
shuju2
shuju3

while循环语句示例:
猜商品价格
通过变量RANDOM获得随机数价格
提示用户猜测并记录次数,猜中后退出循环

[root@localhost test5]# vim price.sh
#!/bin/bash
PRICE=$[$RANDOM % 100 ]
TIMES=0
while true
do
read -p "Please enter the product price [0-99] : " INT
let TIMES++
if [ $INT -eq $PRICE ]
then
echo "Good luck,you guessed it."
echo "You have guessed $TIMES times."
exit 0
elif [ $INT -gt $PRICE ]
then
echo "$INT is too high"
else
echo "$INT is too low"
fi
done

3.until循环语句

until语句的作用是将循环体重复执行,直
到某个条件成立为止。until语句的基本语法如下:

until expression
do
statement1
statement2
...
done

在上面的语法中,expression是一个条件表达式。当该表达式的值不为0时,将执行do和done之间的语
句;当expression的值为0时,将退出until循环结构,继续执行done语句后面的其它的语句。
示例:将创建的test01-test30用户删除

[root@localhost test5]# vim del_user1.sh
#!/bin/bash
i=1
until [ $i -gt 30 ]
do
if [ $i -le 9 ]
then
user=test0$i
else
user=test$i
fi
if id -u $user &>/dev/null
then
userdel -r $user
else
echo "$user is not exists..."
fi
let i++
done

4.select循环语句

select循环语句的主要功能是创建菜单,在执行带有select循环语句脚本时,输出会按照数字顺序的列表
显示一个菜单,并显示提示符(默认是#?),同时等待用户输入数字选择。select语句的基本语法如
下:

select 变量名 [ in 菜单值列表 ]
do
statement1
statement2
...
done

示例:

[root@localhost test5]# vim select.sh
#!/bin/bash
select mysql_version in 5.1 5.6
do
echo $mysql_version
done
[root@localhost test5]# bash select.sh
1) 5.1
2) 5.6
#? 1
5.1
#? 2
5.6
#?

5. 嵌套循环

通过嵌套循环,可以完成更复杂的功能。
示例1:打印九九乘法表

[root@localhost test5]# vim table.sh
#!/bin/bash
for i in `seq 9`
do
for j in `seq 9`
do
[ $j -le $i ] && echo -n "$i*$j= `echo $(($i*$j))` ”
done
echo " "
done
[root@localhost test5]# bash table.sh
1*1= 1
2*1= 2 2*2= 4
3*1= 3 3*2= 6 3*3= 9
4*1= 4 4*2= 8 4*3= 12 4*4= 16
5*1= 5 5*2= 10 5*3= 15 5*4= 20 5*5= 25
6*1= 6 6*2= 12 6*3= 18 6*4= 24 6*5= 30 6*6= 36
7*1= 7 7*2= 14 7*3= 21 7*4= 28 7*5= 35 7*6= 42 7*7= 49
8*1= 8 8*2= 16 8*3= 24 8*4= 32 8*5= 40 8*6= 48 8*7= 56 8*8= 64
9*1= 9 9*2= 18 9*3= 27 9*4= 36 9*5= 45 9*6= 54 9*7= 63 9*8= 72 9*9= 81

作业练习:

1.、判定一个成绩:
85-100 -》 A
70-84 -> B
60-69 -> C
0-59 ->D
程序的边界问题:>100, <0
必须输入的是数字:0-100

编写shell脚本文件:

用if条件判断输入的数字范围是否合理,若合理再进行成绩等级的判断,若不合理则输出错误提示信息。

[root@qingyuxin homework]# vim day2_score.sh 

#!/bin/bash
read -p "Please input your score:" score
if [ $score -ge 0 -a $score -le 100 ]
then
    case "$score" in
    8[5-9]|9[0-9]|100)
        echo "A"
        ;;
    7[0-9]|8[0-4])
        echo "B"
        ;;
    6[0-9])
        echo "C"
        ;;
    *)
        echo "D"
    esac
else
    echo "The number is out of the range"
fi
                                                         

请添加图片描述

执行脚本文件进行测试:

请添加图片描述

2、 循环创建用户:用户名为user01-user20

写shell脚本文件

 [root@qingyuxin homework]# vim day2_useradd.sh 
 
 #!/bin/bash
 for i in {1..20}
 do
     if [ $i -lt 10 ]
     then
         useradd user0$i &>/dev/null
     else
         useradd user$i &>/dev/null
     fi
 done

在这里插入图片描述

执行shell脚本

[root@qingyuxin homework]# source day2_useradd.sh 
 查看/etc/passwd文件,查看脚本是否成功执行!
[root@qingyuxin homework]# cat /etc/passwd

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值