Shell编程中循环语句(for循环、while循环、until循环)

目录

1、for循环

2、while循环

2.1while 读取文件内容

3、until循环


1、for循环

for循环:读取不同的变量值,用来逐个执行同一组命令,即for循环时遍历的过程

格式

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

或者
for ((变量初始值; 变量范围; 迭代方法))
do
  命令序列
done

 示例1

  • 批量添加用户

将用户存入users.txt文档中,使用脚本添加用户

[root@localhost ~]# vim users.txt

zhangsan
wangwu
my
qyd
lisi
[root@localhost ~]# vim useradd.sh

#!/bin/bash
#批量添加用户
for USER in $(cat /root/users.txt) #也可以使用for USER in `cat /root/users.txt)`
do
  useradd $USER
  echo "123123" | passwd --stdin $USER
done
[root@localhost ~]# bash useradd.sh 

 示例2

  • 生成八位数的随机密码,取值范围为大小写英文字母和数字

截取字符串${i;n;m}

i是变量名

n是开始取值的下标,从0开始算起

m是取值长度

 随机数RANDOM

$RANDOM 随机取数,范围为0--32767之间的整数

$RANDOM % i  取出来的数的范围为 0--(i-1)

 字符串的追加方法

  • 变量1+=变量2

  • 变量1=变量1变量2

字符串长度

${ #变量名}

 步骤

[root@localhost ~]# vim passwd.sh

#!/bin/bash
#生成8位数密码
##定义密码的取值范围
String="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

##循环8次
for ((i=1;i<=8;i++))
do
  ##每次循环随机获取0到字符串长度-1的下标值
  num=$[ RANDOM % ${#String} ]
  ##进行字符串的截取,每次截取1个
  var=${String:num:1}
  ##每次追加生成的密码
  passwd+=$var
done
echo "本次生成的密码为:$passwd"
[root@localhost for]# bash passwd.sh 
本次生成的密码为:zT0pH1Eb
[root@localhost for]# bash passwd.sh 
本次生成的密码为:h2algqgp

示例3

  •  ping其他主机 多线程 并行执行
[root@localhost demo]# vim 5.sh

# !/ bin/bash
#多线程管理
for ip in 192.168.52.{1..254}
do
{
ping -c 3 -i 0.5 -w2 $ip &> / dev/null
if [ $? -eq 0 ] ;then
echo "$ip is online" >> /opt/host_ip_online.txt
else
echo "$ip is offline" >>/opt/host_ip_offline.txt
fi
}&
#增加&符号,代表的是将进程放到后台处理,后台命令之间是不区分先来后到关系的done
#wait的作用是等待上面所有后台进程都执行完毕后才会去执行后面的语句。如果没用wait后面的语句是不会等待
后台进程的,会造成一些需要有.上下文依赖关系的程序执行错误。
wait
cat /opt/host_ip_online.txt
cat /opt/host_ip_offline.txt

示例4

  • 将 $PATH中的目录单独输出

查看for循环的默认分隔符

set | grep IFS

由于$PATH是以:为分隔符 所以我们可以将IFS改为冒号

[root@localhost demo]# vim 6.sh

#!/bin/bash
#将$PATH中的文件单独输出出来
IFS_OLD=$IFS
IFS=':'       ##此处也可以写成IFS=$IFS':'在原来默认的分隔符追加一个冒号
for dir in  $PATH
do
  echo $dir
done
IFS=$IFS_OLD
[root@localhost demo]# bash 6.sh 
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

 

2、while循环

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

 格式:

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

 示例:

  • 批量添加用户
[root@localhost demo]# vim 4.sh

#!/bin/ bash
#用户名称以stu开头,按数宁顺序进行编号
#一共添加20个用户,stu1、 stu2 、......、 stu20
#初始密码均设为123456

a=1
while [ $a -le 20 ]
do
useradd stu$a -M
echo "123123" | passwd --stdin stu$a
let a++
done
[root@localhost demo]# bash 4.sh 

  • 猜测商品价格
[root@localhost demo]# vim 1.sh

#!/bin/bash
res=$[RANDOM % 101]
a=0
i=0
while [ $a -eq 0 ]
do
  let i++
  read -p "请输入你猜的价格(0-100) : " price
  if [ $price -eq $res ] ; then
    echo "恭喜你,猜对了!"
    echo "你共猜了 $i 次"
    exit
  elif [ $price -lt $res ] ;then
    echo "猜低了,请继续猜! "
  elif [ $price -gt $res ] ;then
    echo "猜高了,请继续猜!"
  fi
done
[root@localhost demo]# bash 1.sh

 

 2.1while 读取文件内容

格式

while read 变量名
do 
  
done < 文件名

或者
cat 文件名 | while read 变量名
do
 
done

示例 :

  • 将name.txt文件内的内容分别打印出来
[root@localhost demo]# vim 7.sh

#!/bin/bash
while read name
do
 echo $name
done < name.txt

[root@localhost demo]# bash 7.sh 
zhangsan
wang uw
lisi
zhaoliu

 

3、until循环

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

 格式:

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

示例:

计算1-50的和

[root@localhost demo]# vim 2.sh

#!/bin/bash
a=0
sum=0
until [ $a -gt 50 ]
do
  sum=$[ sum + a ]
  let a++
done
echo "1-50的和为$sum"
[root@localhost demo]# bash 2.sh
1-50的和为1275

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值