for循环 | while循环 | until 循环 |
概述:
脚本执行任务的时候总会遇到需要重复执行的时候,为了节省资源,除了计划任务,我们还可以使用脚本来完成,接下来就是Shell脚本中的三种循环
for循环
➤for循环,又有人称之为条件循环,或者for i in ,其实就是for循环的特性,次数和给与的条件是成正比的
➤for语句结构
读取不同的变量值,用来逐个执行同一组命令
for 变量名 in 取值列表
do
命令序列
done
for 循环格式
1.for i in {1…10} 或者 for i in $(seq 1…10…2)
2. for i in $(seq 1 10)或者for i in $(seq 1 2 10)
3. for((i=1;i<=10;i++))或者for((i=1;i<=10;i+=2))
do
echo $i
done
4.for ((i=1;i<=10;i++)); do echo $1;done
➤➤例题:批量添加用户,用户名存放在users.txt文件中,每一行,初始密码均设为123456,创建脚本验证
#!/bin/bash
a=$(cat name.txt)
for i in $a
do
useradd $i
echo "123456" | passwd --stdin $i
或者
echo-e "123456\n123456\n" | passwd $i &> /dev/null
done
➤➤例题:根据IP地址检查主机状态,使用ping命令检测各主机的连通性,创建脚本验证
for i in 192.168.1.{1..254}
do
ping -c 3 -i 0.5 -w 2 $i &> /dev/null && echo " $i line" || echo " $i is offline"
done
while循环
只要条件成立,则反复循环,不成立即停止
while语句结构
while 条件测试操作
do
命令序列
done
➤➤例:输出1到10 的整数
#!/bin/bash
i=0
while [ $i -le 10 ]
do
echo $i
let i++
done
注意: let i++ 位置不同,输出的值是不一样的
➤➤例:有20个以std开头的用户需要创建,并设立123456为初始密码
#!/bin/bash
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin stu$i
i=$[$i +1]
done
➤➤例: 猜商品价格游戏,通过变量RANDOM获取,提示用户猜测和记录次数,猜中后退出
#!/bin/bash
echo "***猜商品价格是多少**"
read -p "输入你心里猜测的数" num
a=0
sum=0
price=$[$RANDOM % 1000 ]
while [ $a -eq 0 ]
do
let num++
if [ $num -eq $price ];then
echo "你猜对了"
let a++
elif [ $num -lt $price ];then
echo "你猜小了"
elif [ $num -gt $prie ];then
echo "你猜大了"
fi
done
echo "你总共猜对了几次"
until循环
重复测试某个条件,只要条件不成立则反复循环
until 条件测试操作
do
命令序列
done
➤➤例:输出1-10整数
#!/bin/bash
a=0
until (( $a -gt 10))
d0
echo $a
let a++
done
➤➤例: 计算1-50的数值总和
#!bin/bash
a=0
sum=0
until [ $a -gl 50 ]
do
echo $[$a+$sum]
let a++
done
➤break 跳出单个循环
例:
for ((a=1; a<=5;a++))
do
echo "外循环第$i次"
if [ $a -eq 3 ];then
break
fi
for ((b=1; b<=5;b++))
do
echo "内循环第$b次"
if [$b -eq 3 ];then
break
fi
done
done
➤break 2 跳出2层循环
for ((a=1; a<=5;a++))
do
for ((b=1; b<=5;b++))
do
echo "内循环第$b次"
if [$b -eq 3 ];then
break 2
fi
done
done
➤continue :中止某次循环中的命令,但不会完全中止整个命令
例:
#!/bin/bash
for ((a=1; a<=5;a++))
do
echo "外层循环为$a"
if [ $a -gt 2 -a $a -lt 4 ];then
continue
fi
echo $[$a*2]
done
例
#!/bin/bash
a=0
while [ $a -lt 10 ]
do
echo "外层循环为$a"
if [ $a -gt 2 -a $a -lt 4 ];then
continue
fi
echo $[$a*2]
let a++
done
结果进入死循环,是因为在执行第3次循环的时候,从continue处跳出来,并没有执行下面的自增,a还是3,又以a=3进入循环,所有周而复始都是a=3在运作。
例
#!/bin/bash
a=0
while [ $a -lt 10 ]
do
let a++
echo "外层循环为$a"
if [ $a -gt 2 -a $a -lt 4 ];then
continue
fi
echo $[$a*2]
done
结果没有进入死循环,是因为在执行第3次循环的时候,从continue处跳出来,并执行了上面的自增,变成了a=4,所以不会进入死循环
➤IFS字段分隔符
默认包含 空格,制表符,换行符
set | grep IFS
IFS= $' \t\n'
修改成只换行
IFS=$'\n'
IFS.OLD=$IFS #先备份一下系统初始值
IFS=$'\n' #修改成你需要的模式
...
IFS=$IFS.OLD #结束后恢复成系统初始值
例:
我文本初始模式
oldifs=$IFS
IFS=$' :|\t\n'
IFS=$oldifs