Shell编程之循环语句

一、循环和遍历

1.1 循环

循环:重复执行一段代码的结构。只要条件满足,多次执行相同的代码

一个循环结构包含:循环体、循环条件

循环条件满足,循环体将一直执行,直到条件不满足为止

优点:

提高代码的重复利用率

提高程序的效率

1.2遍历

遍历:对数据结构当中每个元素进行访问的过程

循环是一种控制流程的结构,而遍历只是对数据的操作

二、for循环

使用场景:用于已知循环次数的场景

格式:

for 变量名 in 取值范围
do 
  命令序列
done

示例1:批量添加用户

  • 用户名存放在users.txt中,每行一个
  • 初始密码设为123456
[root@pup1 opt]# cat users.txt 
hu1
hu2
hu3
[root@pup1 opt]# vim 1.sh 

for i in $(cat /opt/users.txt)
do
useradd $i
echo 123456 | passwd --stdin $i
done

示例2:根据ip地址检查主机状态

  • ip地址存放在ipadds.txt中,每行一个
  • 使用ping命令检测各主机的连通性
  • 如果ping通,放进opt/hosts.txt,ping不通则提示用户
[root@pup1 opt]# vim ip.sh 

for ip in $(cat /opt/ipadds.txt)
do
  ping -c 5 $ip &> /dev/null
  if [ $? -eq 0 ]
  then echo "${ip}可以ping通"
       echo  ${ip} >> /opt/hosts.txt
  else echo "${ip} ping不通"
  fi
done

for循环的类C语言格式:

for((表达式1;表达式2;表达式3))

表达式1:定义变量,给它一个起始值

表达式2:变量的循环范围

表达式3:定义如何循环

示例1:1-10累加求和

[root@pup1 opt]# vim 1.sh 

sum=0
for ((i=0;i<=10;i++))
do
sum=$(($sum+$i))
done
echo "$sum"

示例2:1-100奇数和偶数分别求和

[root@pup1 opt]# vim plus.sh 

#1-100偶数和奇数分别求和
sum1=0
sum2=0
for ((i=0;i<=100;i++))
do
    if [ $(($i%2)) -eq 0 ]
    then
    sum1=$(($sum1+$i))
    else
    sum2=$(($sum2+$i))
    fi
done
echo "$sum1"
echo "$sum2"

三、双层循环和循环控制语句

shell脚本常用命令:

  • echo -n:不换行输出
  • echo -e:可以输出转义字符

可以一起使用:echo -ne

常见转义字符:

  • \b:相当于退格键backspace
  • \n:另起一行继续输出
  • \t:相当于输出一个tab键

3.1 双层循环

示例:99乘法表

[root@pup1 opt]# vim 99.sh 

for i in {1..9}
#控制总的循环次数
do
        for ((j=1;j<=i;j++))  //每一次的值最大只能和i相等
        do
        echo -ne "$j*$i=$(($i*$j))\t"  //取值,分别取i和j的值
        done
echo  //表示换行输出
done  //外循环控制行,内循环控制列

3.2 循环控制语句

continue:满足条件时,跳出本次循环,但是循环条件如果继续存在,继续执行后面的循环

满足条件跳出本次循环,继续下一次循环

break:跳出循环,满足条件即刻退出,不再执行后续循环

示例:

[root@pup1 opt]# vim con.sh 

for i in {1..3}
do
        for j in {1..5}
        do
        if [ $j -eq 3 ]
        then
        break  //表示j的值一旦到3,便跳出内循环,外循环则继续执行
        fi
        echo $j
        done
echo $i
done

脚本运行输出结果:1 2 1 1 2 2 1 2 3

[root@pup1 opt]# vim con.sh 

for i in {1..3}
do
        for j in {1..5}
        do
        if [ $j -eq 3 ]
        then
        continue  //表示j的值一旦到3,跳出此次执行,但是此后仍然满足执行条件依旧会继续执行
        fi
        echo $j
        done
echo $i
done

脚本运行输出结果:1 2 4 5 1 1 2 4 5 2 1 2 4 5 3

[root@pup1 opt]# vim con.sh 

for i in {1..3}
do
        for j in {1..5}
        do
        if [ $j -eq 3 ]
        then
        break 2  //表示j的值一旦到3,跳出内循环和外循环
        fi
        echo $j
        done
echo $i
done

脚本运行输出结果:1 2

[root@pup1 opt]# vim con.sh 

for i in {1..3}
do
        for j in {1..5}
        do
        if [ $j -eq 3 ]
        then
        continue 2  //表示j的值到3,内循环和外循环都跳出执行,但是后续仍然满足循环条件便继续执行
        fi
        echo $j
        done
echo $i
done

脚本运行输出结果:1 2 1 2 1 2

3.3 实验

设置一个随机数字,比这个数字大,提示用户输大了,比这个数字小,提示用户输小了,猜中的话提示用户猜对了,猜中后打印一共猜了多少次

如何生成随机数:

$RANDOM  默认范围:0-32767

生成0-100如何表示:

$((RANDOM%100+1))

[root@pup1 opt]# vim guess.sh 

num=`echo $((RANDOM%100+1))`
time=0
for ((;;))
do
let time++
  read -p "请输入您猜测的数字:" user
        if [ $user -eq $num ]
        then echo "您猜对了"
        break
        elif [ $user -gt $num ]
        then echo "您猜大了"
        elif [ $user -lt $num ]
        then echo "您猜小了"
        fi
done
echo "您一共猜了${time}次"

四、While循环

使用场景:不知道循环次数,需要主动结束循环,或者达到条件结束循环

格式:

while [判断条件]
do
  执行命令
done

死循环:

while true
while [ 1 -eq 1 ]

示例1: 

[root@pup1 opt]# vim while.sh

i=1  //定义变量
while [ $i -le 5 ]
do
  echo $i
let i++
done

示例2:累加求1-100之间的奇数和和偶数和

[root@pup1 opt]# vim while.sh 

i=1
sum1=0
sum2=0
while [ $i -le 100 ]
do
  if [ $(($i%2)) -eq 0 ]
  then sum2=$[$sum2+$i]
  elif [ $(($i%2)) -eq 1 ]
  then sum1=$[$sum1+$i]
  fi
let i++
done
echo "奇数和为$sum1"
echo "偶数和为$sum2"

 

五、until循环

格式:

until [条件判断]
do
  命令序列
done

示例:

[root@pup1 opt]# vim until.sh

i=0
until [ $i -gt 5 ]
do  echo $i
let i++
done

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值