一、循环和遍历
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