循环语句:1.for循环语句;2.while循环语句;3.until循环语句
for循环:已知循环次数的循环
执行机制
1.依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。
2.如果省略 [in WORDS ... ] ,此时使用位置参数变量 in "$@"
例:打印1到10的三种方法:
#方法一:
[root@zy2 ~]# for i in {1..10} #{1..10}取值列表
> do #开始执行循环
> echo $i
> done #结束循环
1
2
3
4
5
6
7
8
9
10
#方法二:
[root@zy2 ~]# for i in $(seq 1 10)
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10
#方法三:
[root@zy2 ~]# for ((i=1;i<=10;i++))
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10
例:批量添加用户,用户名存放在users.txt文件中,初始密码均设为123456,验证脚本
for i in $(cat /opt/users.txt)
do
useradd "$i"
echo 123456 | passwd --stdin "$i"
done
例:根据ip检查主机状态,ip地址存放在ipadds.txt文件中,每行一个,使用ping命令检测各主机的连通性
for i in {1..10}
do
ping -c 2 192.168.126.$i &> /dev/null
if [ $? == 0 ]
then
echo host $i is online
else
echo host $i is offline
fi
done
[root@zy2 ~]# sh ping.sh
host 1 is offline
host 2 is online
host 3 is offline
host 4 is offline
host 5 is offline
host 6 is offline
host 7 is offline
host 8 is offline
host 9 is online
host 10 is offline
例:1-100求和
#!/bin/bash
#1-100区间求和
sum=0
for ((i=1;i<=100;i++))
do
sum=$(($i+$sum))
done
echo $sum
[root@zy2 ~]# sh aa.sh
5050
例:打印正三角形
#!/bin/bash
#打印正三角形
read -p "输入一个数:" n
for i in `seq 1 $n`
do
for ((j=$n;j>i;j--))
do
echo -n " "
done
for m in `seq 1 $i`
do
echo -n "*"
done
for ((k=2;k<=i;k++))
do
echo -n "*"
done
echo " "
done
[root@zy2 ~]# sh tu2.sh
输入一个数:7
*
***
*****
*******
*********
***********
*************
while循环
用于不知道循环次数,需要主动结束循环或达到条件结束循环。
1、基本格式
while [ 判断条件] 使用while循环满足条件执行do,不满足不执行
do
执行动作 while循环执行动作
done while循环结束标志
例while求和
#!/bin/bash
num=0
i=1
while [ $i -le 100 ]
do
num=$(($i+$num))
let i++
done
echo "$num"
[root@zy2 ~]# sh test1111.sh
5050
until循环
1.基本格式
until循环通常用于当某个条件不满足时执行一些操作,比如等待某个进程退出、等待某个文件被创建等等
格式:
until [ 条件测试操作 ]
do
判断式/命令序列
done
例:until求和
#!/bin/bash
num=0
i=1
until [ $i -gt 100 ]
do
num=$(($i+$num))
let i++
done
echo "$num"
跳出循环
continue跳出循环:表示满足continue条件时跳出循环,但是不影响后续循环执行
#!/bin/bash
for i in {1..5} #for循环5次从i=1开始到i=5
do
if [ $i -eq 3 ] #if判断语句,若$1等于3则执行then的内容
then
continue #当$i=3时跳出循环但不影响后面循环
fi #结束if语句
echo "$i" #没执行一次for循环输出一次$i
done
[root@zy2 ~]# sh test1_1.sh
1
2
4
5
break跳出循环
在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环
#!/bin/bash
for j in {1..3} #第一层for循环,j=1,2,3各执行一次do的内容
do #第一层for循环的执行内容
for i in {1..5} #第二层for循环,i=1,2,3,4,5各执行一次do的内容
do #第二层for循环的执行内容
if [ $i -eq 3 ] #第二层for循环中添加的if判断语句,当$i=3是执行then内容
then
break #第二层for循环判断语句执行命令,break结束循环
fi #if语句结束
echo "$i" #第二层for循环语句执行每循环一次输出$i
done #第二层for循环语句结束标志
done
[root@zy2 ~]# sh test1_1.sh
1
2
1
2
1
2
例:9*9乘法表
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -n "$j*$i=$[$i*$j] "
done
echo ""
done
[root@zy2 ~]# sh shell17.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81