shell 循环之 for ,while ,until 语句

shell 循环语句

一:for 循环



1.1. for 循环语句格式



1.1.最简循环:

for ((i=1;i<=10;i++));  # 变量i赋值1,判断变量i是否小于等于10,如果成立,则i值+1‘,等同((i=1;i<=10;i=$[i+1]))。 i=1 是初始化一个变量,i<=10 是循环条件,i++是循环条件变更步长,每次加1。
do
		echo $i              #打印变量i 的值
done 

image-20210712100756520

image-20210713100352686



for  ((i=1;i<=10;i=$[i+2]));
do
    echo $i
done

image-20210712103956585



1.1.2一般循环:

for 变量名 in  取值列表
do
		命令序列
done
取值列表 释义
for i in "值1" “值2” 变量i 依次取值 "值1",“值2”
for i in /root/* 变量i 依次取值 /root/ 下的文件/目录名
for i in /etc/*.conf 变量i 依次取值 /etc/ 下,以 .conf 结尾的文件/目录
for i in $(seq 10 -1 1) 变量i 依次取值,从10 到1 ,步长是 -1
for i in 变量i 依次取值,从1 到10
for i in $(ls /root/) 变量i 依次取值,为 ls /root/ 命令的执行结果
for i in $(< /etc/passwd ) 变量i 依次取值, /etc/passwd 的文件每一行内容
for i in $1 $2 $@ 变量i 依次取值,参数1,参数2 ,及所有参数个数

image-20210713111821441



[root@host103 opt]# vim abc.sh

#!/bin/bash
for i  in  "zhangsan" "lisi"    # 变量i 在"zhangsan“和 "lisi" 中取值
do
    echo $i
done
~           

image-20210712102929894



[root@host103 opt]# vim abc.sh

#!/bin/bash
for i  in  /opt/*     # 变量 $i 取值 /opt 目录下的文件和子目录(得到的是绝对路径)
do
    echo $i
done 

image-20210712103049043



[root@host103 opt]# vim abc.sh 
#!/bin/bash
for i  in  /opt/*.sh      #/opt/*.sh  ,变量 $i 取值目录/opt/下,以 .sh 结尾的
do
    echo $i
done
~     

image-20210712103210198



[root@host103 opt]# vim abc.sh
#!/bin/bash
for i  in  $(seq 5 -1 1)     #从5到1,每次变化步长是 -1 。变量 $i 取值从 5 到 1
do
    echo $i
done 

image-20210712103319945



[root@host103 opt]# vim abc.sh
#!/bin/bash
for  i in {1..5}      #{1..5},从1到5的连续整数, 变量 $i 取值1 到 5
do
    echo $i
done

image-20210712104503884



[root@host103 opt]# vim abc.sh
#!/bin/bash
for i  in  $(ls /opt/)      # 命令ls /opt/ 执行的结果作为变量 $i 的值(获得的是/opt/目录下的数据的相对路径)
do
    echo $i
done 

image-20210712103425554



[root@host103 opt]# vim abc.sh 
#!/bin/bash
for i  in  $(<userlist)    # "<",为重定向输入,变量 $i 取值是 文件userlist的内容。
do
    echo $i
done

image-20210712103606244



[root@host103 opt]# vim abc.sh
#!/bin/bash
for i  in  $1 $2 $@       #变量 $i 取值 位置变量1 ,位置变量2 及 当前所有的位置变量
do
    echo $i
done 

image-20210712103706780



1.2 for 循环练习



1.2.1 使用for 循环产生3个随机数

[root@host103 opt]# vim myfor.sh
#!/bin/bash
for i in {1..3}  
do
    echo $RANDOM
done

image-20210712104637000



1.2.2 使用for 循环检测网络中存活的主机ip(最好使用脚本路径的执行方式,使用source 会有后台命令完成的提示信息)

[root@host103 opt]# vim  myforping.sh 
#!/bin/bash
for  ip in {1..255}
do
{
    ping  -c 3  -i 0.5 -w 2  192.168.23.$ip &> /dev/null  # ping 命令 -c:ping次数 ; -i 每次发
送ping 包间隔时间  ;  -w ping 开始后多少秒结束
     if [ $? -eq 0 ];then                                #ping 命令的返回值。通了,返回0,不通
返回非零
            echo "$ip is up" >> /root/ping.txt
    else
         echo "$ip is down " >> /root/ping.txt
     fi
}&                                       #将 整个 ping 和 判断 放入后台并行执行,效率更高
done
wait
cat /root/ping.txt
rm -rf /root/ping.txt



[root@host103 opt]# chmod + x myforping.sh
[root@host103 opt]# ./myforping.sh

image-20210712125158611



1.2.3 使用for 循环批量添加用户并设置密码

[root@host103 test]# echo "zhangsan
> lisi
> wangwu" > /test/userlist                #保存用户名的文件

[root@host103 test]# vim UserAdd.sh
#!/bin/bash
for Name in $(</test/userlist)            #for 循环 从用户名文件中读取数据
do
    id $Name &> /dev/null                #查看用户是否存在。存在,返回值为0,不存在,返回值为非零
    Status=$?                        
    if [ $Status -eq 0 ];then      
        echo "$Name" is exist
    else
        useradd -m -p "123456" $Name      #用户不存在,则创建用户,并设置密码是"123456"
        echo  "$Name  created"
    fi
done

image-20210713102611164



二 :while 循环

重复性测试某个条件,只要条件成立,则反复执行



2.1 while循环格式

while 条件测试
do
	命令序列
done

image-20210713104229679



2.2 while 循环练习



使用 while 循环完成猜数小游戏

#!/bin/bash

NUM=$[RANDOM%1000]            #取 0-999 的随机数
usernum=-1
a=0
while [ $usernum -ne $NUM ]               #一直猜数,直到猜对
do
    echo "Enter q or Q to exit"
    read -p "input your number: " usernum
    let a++                                           #每次猜数,变量 a 值加1
    
    if [[ $usernum == "q"  || $usernum == "Q" ]];then     # 当输入 q 或者 Q 则退出游戏
        echo "您退出了游戏"
        return                                           

    elif [ $usernum -gt $NUM ];then               
        echo "your number is bigger "             #如果用户猜大了,则给出提示信息
        echo ""                                   #输出空行,显得更加好看
    else
        echo "your number is smaller"             #用户猜小了,也给出提示信息
        echo ""
    fi
done
echo "you win "
echo "The num is $NUM"                           #告诉用户 数字是多少
echo "你一共猜了$a次"                              #告诉用户一共猜了几次
~                     

image-20210715120340382

image-20210715120349150



三:until 循环

until 语句,重复测试某个条件,只要条件不成立则反复执行

3.1 until 语句格式

until  条件测试操作
do
		命令序列
done

image-20210716085235289



3.2 until 练习

使用 until 计算 1-50 的和值

#!/bin/bash

a=1          #设置 变量a的 初始值为1
sum=0        #sum 用来接计算的和值 
until [ $a -gt 50 ]          #until 条件不成立时循环。 当a 值 大于50 时,退出循环。
do
    sum=$[$sum + $a ]       #每次循环,变量sum的值 都为原 sum 值加上变量a的值 .最后的值,即为1到50 的和值
    let a++                 #每次循环,变量 a 的值+1
done

echo "从1 到 50 的和值是 $sum"   #打印 1-50 的和值
~                                

image-20210716093108527

posted @ 2021-07-16 09:42  知己一语  阅读(221)  评论(0编辑  收藏  举报