shell循环语句
循环语句的作用
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的 对象不一样,其他命令相同。
例如,根据通讯录中的姓名列表创建系统账号,根据服务器清 单检查各主机的存活状态当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代 码更是显得异常烦琐、困难重重
一,for循环
1、语法结构
(1)列表循环
(2)不带列表循环
(3)类C风格的for循环
遍历
for 变量名 in {list}
do
command
done
for i in {a..c}
do
echo $i
done
for i in {1..5} //{}里面不识别变量
do
echo $i
done
for i in `seq 5` //seq 5=1、2、3、4、5序列
do
echo $i
done
a=10
for i in `seq $a` //seq可以引用变量
do
echo $i
done
for 变量名 in a b c
do
command
done
for i in a b c //i这里实际没有调用,所以就相当于in后面几个参数就循环几次
do
echo 123
done
for i in a b c //这里调用到i变量了,所以就正常显示i的值(a\b\c)
do
echo $i
done
2.技巧
for i in {1..50..2} 1-50的奇数
for i in {2..50..2} 1-50的偶数
for i in {10..1} 1-10倒序排列
for i in $(seq 10) 1-10正序排列
for i in $(seq 10 -1 1) 1-10倒序排列
for i in $(seq 1 2 10) 1-10的奇数,中间为步长
for i in $(seq 0 2 10) 1-10的偶数,中间为步长
例子:
for i in $(seq 0 2 10);do echo $i ;done
3,示例
1.打印1-5这5个数字
vim for.sh
#!/bin/bash
for i in {1..5}
do
echo $i
done
2.打印5次hello world
注意:虽然我们定义了一个变量i,但是没有使用它,它只是控制循环次数
vim for.sh
#!/bin/bash
for i in {1..5}
do
echo hello world
done
3.输出0-50之间的偶数
vim for1.sh
#!/bin/bash
for i in {0..50..2} //..2代表步长为2,每隔2个
do
echo $i
done
4.类C风格的for循环
for ((expr1;expr2;expr3))
do
command
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
1.打印1-5
迭代
vim for.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
echo $i
done
2.打印1-10的奇数
[root@server ~]# vim for3.sh
#!/bin/bash
for ((i=1;i<=10;i+=2)) //i=i+2
do
echo $i
done
3.脚本批量添加用户=====
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &>/dev/null
done
注:i++ : i=1+1 先赋值再运算 i=1 之后 再 +1
++i : 1+1=i 先运算再赋值 1+1 之后 再=i
二,while循环
while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
1.语法结构:
while 表达式
do
command
done
1.打印1-5
vim while.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i++ //注意这里如果不改变$i的值,会变成死循环
# i=$[$i+1] //两种写法
done
echo "最后i的值为: $i"
2.输出1-100之间不能被3整除的数字
vim 3.sh
#!/bin/bash
i=1
while [ $i -le 100 ]
do
if [[ $i%3 -ne 0 ]]
then echo "$i"
fi
let i++
done
2.while死循环
while [ 1 -eq 1 ] //写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
do
command
done
while true
do
command
done
while :
do
command
done
猜数字,猜不对就一直猜
num=10
while true
do
read -p "请输入数字:" shu
if [ $shu -eq $num ];then
echo "你猜对了"
break
elif [ $shu -gt $num ];then
echo "你猜大了"
elif [ $shu -lt $num ];then
echo "你猜小了"
fi
done
三,until循环
1.跟while相反,条件为假进入循环,条件为真退出循环
语法结构
until 表达式
do
command
done
2.死循环结构
until false
do
command
done
until [ 1 -ne 1 ]
do
command
done
四,循环控制语句
for循环一般会搭配条件判断语句和流程控制语句一起执行,那么就会出现需要跳过循环和中止循环的情况,控制循环的命令有以下3个
1、continue
继续,但不会执行循环体内下面的代码了,开始重新开始下一次循环
例1:打印1-5的数字,3不打印
vim for4.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
if [ $i -eq 3 ];then
continue
else
echo $i
fi
done
结果是1245,3不输出,因为跳出后面的echo语句执行下一次循环了
2、break
打断,马上停止本次循环,执行循环体外的代码
例2:1-10的数字,7后面的都不打印
vim for4.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
if [ $i -eq 8 ];then
break
else
echo $i
fi
done
3、exit
直接跳出程序,后面可跟状态返回码如exit 1等等
for i in {1..5}
do
if [ $i -eq 3 ];then
exit 100
else
echo $i
fi
done
echo hi
直接跳出程序所以不会执行最后的echo hi,并且返回码是100通过$?查看