shell循环语句

循环语句的作用

在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的 对象不一样,其他命令相同。

例如,根据通讯录中的姓名列表创建系统账号,根据服务器清 单检查各主机的存活状态当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代 码更是显得异常烦琐、困难重重

一,for循环

1、语法结构

(1)列表循环
(2)不带列表循环
(3)类C风格的for循环

遍历
for 变量名 in {list}
do
    command
done

for i in {a..c}
do
        echo $i
done

for i in {1..5}    //{}里面不识别变量
do
        echo $i
done


for i in `seq 5`   //seq 5=1、2、3、4、5序列
do      
        echo $i
done

a=10
for i in `seq $a`    //seq可以引用变量
do
        echo $i
done


for 变量名 in a b c
do
    command
done

for i in a b c   //i这里实际没有调用,所以就相当于in后面几个参数就循环几次
do
        echo 123
done

for i in a b c    //这里调用到i变量了,所以就正常显示i的值(a\b\c)
do
        echo $i
done

2.技巧

for i in {1..50..2} 1-50的奇数

for i in {2..50..2} 1-50的偶数

for i in {10..1}  1-10倒序排列

for i in $(seq 10)  1-10正序排列

for i in $(seq 10 -1 1) 1-10倒序排列

for i in $(seq 1 2 10) 1-10的奇数,中间为步长

for i in $(seq 0 2 10) 1-10的偶数,中间为步长

例子:
for i in $(seq 0 2 10);do  echo $i ;done 

3,示例

1.打印1-5这5个数字
vim for.sh
#!/bin/bash

for i in {1..5}
  do
        echo $i
  done
  
2.打印5次hello world
注意:虽然我们定义了一个变量i,但是没有使用它,它只是控制循环次数
vim for.sh
#!/bin/bash

for i in {1..5}
  do
        echo hello world
  done

3.输出0-50之间的偶数
vim for1.sh

#!/bin/bash
for i in {0..50..2}  //..2代表步长为2,每隔2个
do
        echo $i
done

4.类C风格的for循环
for ((expr1;expr2;expr3))
do
command
done

expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出

1.打印1-5
迭代
vim for.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
     echo $i
done

2.打印1-10的奇数

[root@server ~]# vim for3.sh
#!/bin/bash
for ((i=1;i<=10;i+=2))   //i=i+2
do
     echo $i
done

3.脚本批量添加用户=====
#!/bin/bash
ULIST=$(cat /root/users.txt) 

for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &>/dev/null 
done

注:i++ : i=1+1 先赋值再运算 i=1 之后 再 +1
++i : 1+1=i 先运算再赋值 1+1 之后 再=i

二,while循环

while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环

1.语法结构:

while 表达式
do
command
done

1.打印1-5
vim while.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
    echo $i
    let i++   //注意这里如果不改变$i的值,会变成死循环
#	i=$[$i+1]  //两种写法
done
echo "最后i的值为: $i"

2.输出1-100之间不能被3整除的数字
vim 3.sh 

#!/bin/bash
i=1
while [ $i -le 100 ]
 do
 if [[ $i%3 -ne 0 ]]
 then echo "$i"
 fi
 let i++
done

2.while死循环

while [ 1 -eq 1 ] //写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
do
command
done

while true
do
command
done

while :
do
command
done

猜数字,猜不对就一直猜
num=10
while true
do
read -p "请输入数字:" shu
if [ $shu -eq $num ];then
        echo "你猜对了"
        break
elif [ $shu -gt $num ];then
        echo "你猜大了"
elif [ $shu -lt $num ];then
        echo "你猜小了"
fi
done

三,until循环

1.跟while相反,条件为假进入循环,条件为真退出循环

语法结构
until 表达式
do
command
done

2.死循环结构

until false
do
command
done

until [ 1 -ne 1 ]
do
command
done

四,循环控制语句

for循环一般会搭配条件判断语句和流程控制语句一起执行,那么就会出现需要跳过循环和中止循环的情况,控制循环的命令有以下3个

1、continue
继续,但不会执行循环体内下面的代码了,开始重新开始下一次循环

例1:打印1-5的数字,3不打印
vim for4.sh

#!/bin/bash
for ((i=1;i<=5;i++))
do
        if [ $i -eq 3 ];then
        continue
        else
        echo $i
        fi
done
结果是1245,3不输出,因为跳出后面的echo语句执行下一次循环了

2、break
打断,马上停止本次循环,执行循环体外的代码

例2:1-10的数字,7后面的都不打印
vim for4.sh

#!/bin/bash
for ((i=1;i<=10;i++))
do
        if [ $i -eq 8 ];then
        break
        else
        echo $i
        fi
done


3、exit
直接跳出程序,后面可跟状态返回码如exit 1等等

for i in {1..5}
do
if [ $i -eq 3 ];then
        exit  100 
else
        echo $i
fi

done
echo hi
直接跳出程序所以不会执行最后的echo hi,并且返回码是100通过$?查看
posted on 2022-02-14 14:52  杨文昭  阅读(80)  评论(0编辑  收藏  举报