目录
文章目录
前言
一.for循环
带列表的循环
不带列表的循环
基于C语言风格的循环
二.while循环
三.until循环
四.循环控制
五.循环嵌套
总结
前文介绍了条件判断,本文章将介绍流程控制之循环。
作用:在shell脚本中,for循环主要用于对一组数据或文件进行遍历处理。
结构:
for variable in list
do
command1
command2
...
done
其中,variable
是用来保存每个元素的变量名,list
是需要遍历的元素列表,可以是一组数字、字符串,或者是一个文件中的行等等。在循环体中,可以执行需要重复执行的命令,如输出、计算等操作。
案例:
#!/bin/bash
for ip in 192.168.186.100 192.168.186.102 192.168.186.103
#写法2:for ip in 192.168.186.{100..103..1}:{开始值..终止值..步长} {}:产生集合的值
do
echo $ip
done
[root@timeserver ~]# bash test1.sh
192.168.186.100
192.168.186.102
192.168.186.103
案列 2: 获取指定目录下的所有目录的文件名
[root@server ~]# vim for3.sh
#!/bin/bash
for FILE in $(ls -F / | grep /$) #-F将显示内容进行类别归类
do #^代表行首 $代表行尾 grep /$:过滤以/为结尾
echo $FILE
done
#检索从键盘输入的目录
read -p "请输入检索的目录" dir
for file in $(ls -F $dir | grep /$ )
do
echo $file
done
案列 3:计算1+2+3+4+5+……+100和
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in {1..100..1}
do
((sum=sum+i))
done
echo "sum=$sum"
原则:for不提供循环列表,shell将使用位置参数从命令行获取循环列 表数据及条件
格式:
for variable
do
statement1
statement2
...
done
格式:
for ((初始化;条件表达式;步长)) # 注意:2个园括号
do
statement1
statement2
...
done
案列:面试题:批量创建账户并给账户设置密码
[root@server ~]# vim for6.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
if ! id -u test$i &> /dev/null
then
useradd test$i
echo "123456" | passwd -- stdin test$i &> /dev/null
else
echo "test$i 已存在!"
fi
done
#id -u:测试账户是否存在
#test$i:当i=1时,$提取i的值为1,此时test$i为test1
#i:取反
#passwd -- stdin:按标准输入设置密码
注意:i++置后自增:先使用 i 的值参与后续运算,最后增加1
++i置前自增 :先增自增1,在参与后续运算
[root@server ~]# x=1
[root@server ~]# y=2
[root@server ~]# echo $((x++))
1
[root@server ~]# echo $x
2
[root@server ~]# echo $((++y))
3
[root@server ~]# echo $y
3
格式:
while expression
do
statement1
statement1
……
done
案例:
猜商品价格,通过变量RANDOM获取随机整数并控 制20以内,提示用户猜测商品价格,猜测时需要记录次 数,猜中后退出程序
[root@server ~]# vim while2.sh
#!/bin/bash
PRICE=$((RANDOM%20))
count=0 #定义变量存储次数
while true # 无循环条件恒真执行
do
read -p "请输入[1-20]间的商品价格: " INT
let ((count++))
if (($INT==$PRICE))
then
echo "恭喜,你猜对了!"
echo "你使用了$count次机会."
exit 0 #用于跳出恒真执行防止死循环
# 跳出while循环
elif (($INT>$PRICE))
then
echo "你输入的商品价格高了."
else
echo "你输入的商品价格低了."
fi
done
# RANDOM是一个环境变量,产生[1,32767]的整数,对20取余是控制随机数在1-19间
格式:
until expreession
do
statement1
statement2
……
done
案列:批量删除账户
#!/bin/bash
i=1
until [ $i -gt 10 ] # i>10 ,注意,条件要相反
do
if id -u test$i &> /dev/null
then
userdel -r test$i
else
echo "test$i 账户已删除"
fi
let i++
done
案列:判断素数
[root@server ~]# vim for7.sh
#!/bin/bash
read -p "请输入一个正整数: " prime
if ((prime<2))
then
echo "数据错误,请输入大于等于2的正整数."
else
for ((i=2;i
案列2:计算100到150之间不能被3整除的数,输出时一行 显示5个
#!/bin/bash
count=0
for ((i=100;i<=150;i++))
do
if ((i%3==0))
then
continue
fi
echo -ne "$i\t"
((count++))
if ((count%5==0))
then
echo
fi
done
echo
案例:打印99乘法表
#!/bin/bash
for i in `seq 9`
do
for j in `seq 9`
do
((j<=i)) && echo -ne
"$i*$j=`echo $((i*j))`\t"
done
echo
done
案列2:打印三角形
#!/bin/bash
for ((i=1;i<10;i++)) # 打印9行
do
for ((j=1;j<10-i;j++)) # 每一行打印一
些空格
do
echo -n " "
done
for ((k=1;k<=i;k++)) # 每一行打印一
些数字
do
echo -n "$i "
done
echo # 打印一个\n
done