系统相关
首页 > 系统相关> > shell脚本的for循环,while循环,until循环语句

shell脚本的for循环,while循环,until循环语句

作者:互联网

文章目录

一,for循环

1.1 for循环格式

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

会输出1到10
在这里插入图片描述
编辑for.sh
在这里插入图片描述
在这里插入图片描述
那么如何隔两位输出结果呢?
例如13579
在这里插入图片描述
在这里插入图片描述

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 {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 ,及所有参数个数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

[root@caoyuzhou ~](https://www.icode9.com/i/ll/?i=c53bd825354e4d1a93d069b5954cb088.png)
# vim for.sh
#!/bin/bash
for  i in {1..5}      #{1..5},从1到5的连续整数, 变量 $i 取值1 到 5
do
    echo $i
done

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

1.2 小练习

使用for循环检测网络中存活的主机ip

[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@caoyuzhou ~]# 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

在这里插入图片描述

二 :while 循环

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

2.1 while循环格式

while 条件测试
do
	命令序列
done

在这里插入图片描述

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次"                              #告诉用户一共猜了几次            

在这里插入图片描述

三:until 循环

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

3.1 until 语句格式

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

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 的和值

在这里插入图片描述

标签:shell,ping,echo,while,循环,done,root,until
来源: https://blog.csdn.net/OSoooo/article/details/119133782