目录
一、for循环语句
1.1 基本格式
for 变量名称(注意是名称不是变量$等) [ in 名称范围 ] (可以不写)
do
执行内容 若满足循环则做什么动作
done for循环结束标志
示列:
for i in $(cat /opt/users.txt)
do
useradd $i
echo 123456 | passwd --stdin $i
done
#!/bin/bash
for i in {1..5} #for循环5次,第一次i=1,第二次i=2以此类推直到i=5
do
echo "$i" #循环动作,每次输出$i
done #for语句结束标志
bash a.sh #调用shell执行脚本a.sh
类C语言格式
for (( 表达式1 ;表达式2;表达式3 ))
do
执行内容 若满足循环则做什么动作
done for循环结束标志
表达式1:定义变量并赋值
表达式2:决定是否循环(定义循环退出的条件)
表达式3:决定循环变量如何改变,决定循环什么时候结束
#!/bin/bash i++ >> i=i+1
i++(后缀增量):先返回 i 的当前值,然后将 i 增加1。
++i(前缀增量):先将 i 增加1,然后返回增加后的值。
for(( i=0;i<=5;i++ )) #定义for循环i变量初始值为0,循环条件i小于等于5,每循环一次i自加1
do
echo "$i" #for循环每循环一次执行一次输出$i
done #for语句结束标志
bash a.sh #调用shell执行脚本
输出结果:
0
1
2
3
4
5
练习:
数字累加脚本(1-100)
需求:编写脚本实现计算从1加到100的值
思路:
①累加需要用到循环,已知循环次数时使用for循环
②也可以使用while循环达到累加条件时结束循环
vim sum.sh #创建sum.sh脚本
sum=0 #定义变量sum初始值为0
for i in {1..100} #for循环 i取值从1到100
do
sum=$(($i+$sum)) 1+0 2+1 3+3
#let sum=$i+$sum #每次循环内容计算变量i+sum的值赋值给sum,二选一
done #for语句结束标志
echo "1-100累加值为:$sum" #循环结束后输出内容
sh sum.sh #调用shell执行脚本
执行结果:
"1-100累加值为:5050"
1.2 seq命令
seq 是一个 Linux/Unix 命令,用于生成一个序列(sequence)并打印出来
示列:
[root@localhost opt]# seq 10 #表示到10结束
1
2
3
4
5
6
7
8
9
10
[root@localhost opt]# seq 10 -2 1 #10表示从10开始
10
8
6
4
2
[root@localhost opt]# a=$(seq 1 10)
[root@localhost opt]# echo -n $a
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]# a=$(seq 20 -1 1) #反向生成
[root@localhost ~]# echo $a
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
综合练习:
求从1到100所有整数的偶数和、奇数和
#!/bin/bash
num1=0 #偶数和的初始值
num2=0 #奇数和的初始值
(嵌套if)
for i in {1..100}
do
if (( i % 2 == 0 )); then #判断i是否是偶数
num1=$(($num1+i)) #如果是偶数,则加到偶数和中
else
num2=$(($num2+i)) #如果是奇数,则加到奇数和中
fi
done
echo "1 到 100 中所有偶数的和为:$num1"
echo "1 到 100 中所有奇数的和为:$num2"
1.3 常用转义符
echo -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上 echo -ne
只有加了-e才能执行下面的转义符:
转义符 | 说明 |
\b | 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符。 |
\c | 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。 |
\n | 换行,被输出的字符从"\n"处开始另起一行 |
\f | 换行,但是换行后的新行的开头位置连接着上一行的行尾; |
\v | 与\f相同; |
\t | 转以后表示插入tab,即横向制表符(tab); |
\r | 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖 |
\\ | 表示插入"\"本身; |
1.4 跳出循环
1.4.1 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 #for循环结束语句
sh a.sh #调用shell执行脚本
输出结果
1
2
4
5
continue 2 是一个 Shell 中的控制结构,它的作用是在循环内部跳过本次循环并继续下一次循环,
而且会跳过两层循环,即在两层循环内部执行。
在嵌套循环中,如果我们使用 continue 2 命令,
它将跳过包含它的内层循环和外层循环的迭代,并继续执行下一次外层循环的迭代。
1.4.2 break
在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。
break [数字] 结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,
若为3则结束自己所在循环和外边嵌套的2层循环
break 命令并不控制循环次数,它是用于控制循环流程的。
当 break 命令执行时,它会立即跳出当前的循环并继续执行循环后面的代码。
exit
示列:
vim a.sh #创建a.sh脚本
脚本内容:
#!/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 2 #第二层for循环判断语句执行命令,break控制循环的流程
fi #if语句结束
echo "$i" #第二层for循环语句执行每循环一次输出$i
done #第二层for循环语句结束标志
done #第一层for循环语句结束标志
具体来说,这段脚本的执行过程如下:
外部循环 for j in {1..3} 循环执行三次,j 分别等于 1、2、3。
在每次外部循环开始时,内部循环 for i in {1..5} 循环执行五次,i 分别等于 1、2、3、4、5。
在内部循环中,当 i 等于 3 时,执行 break 跳出循环。
在内部循环中,使用 echo "$i" 打印当前的数字序列。
在内部循环执行完毕后,外部循环继续执行,直到执行完三次为止
1
2
1
2
1
2
1.4.3 break 和 continue 的比较
-
break:在循环内部,当执行到 break 命令时,会立即跳出当前的循环,停止循环执行,然后继续执行下一条指令。
可以使用 break 命令来提前终止循环,例如当达到特定条件时或者已经执行了足够的次数。
-
continue:在循环内部,当执行到 continue 命令时,会跳过本次循环剩余的代码,并继续下一次循环。
可以使用 continue 命令来跳过循环中的某些操作,例如在特定条件下跳过一次循环,或者只执行符合条件的循环。
在嵌套循环中,可以在 break 和 continue 命令后面指定数字参数,来指定跳出或跳过多层循环。
例如,break 2 会跳出当前循环和外层循环的迭代,而continue 2会跳过当前循环和两层外层循环的迭代。
break和continue命令是控制循环流程重要命令。
1.5 调试命令
set -x 开启调试模式
set +x 关闭调试模式
1.6 综合练习
循环打印9*9乘法表
思路:
- 第一步for循环打印一行9个*号
- 第二步再添加一个for循环打印一个9行9列的*号正方形
- 第三步将*号正方形斜砍一般形成9*9乘法表的基本格式
- 第四步将*号9*9乘法表格式用乘法算式替换
第一步:
vim 99.sh #创建99.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9} #for循环9次从i=1开始
do
echo -n "*" #每循环一次打印一个*,echo -n参数表示不换行
done #此for循环语句结束
bash 99.sh #调用shell执行脚本
执行结果:
*********
第二步:
vim 99.sh #编辑99.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9} #添加打印列循环,循环9次从i=1开始
do #j循环时做do中的内容
for j in {1..9} #第一步for循环内容不变
do
echo -n "*"
done
echo #列循环每循环一次进行换行
done #列循环for语句结束标志
bash 99.sh #调用shell执行脚本
执行结果:
*********
*********
*********
*********
*********
*********
*********
*********
*********
第三步:
第三步将*号正方形斜砍一般形成9*9乘法表的基本格式
vim 99.sh
脚本内容:
#!/bin/bash
for i in {1..9} #行循环内容不变
do
for ((j=1; j<=i; j++)) #修改行循环j的取值范围为展开变量j,即当j=1时i取值只有1,所以循环一次。当
j=2时,i取值为1和2,所以i=1和i=2各循环一次,循环2次。以此类推到j=9
do
echo -n "*"
done
echo
done
bash 99.sh #调用shell执行脚本
执行结果:
*
**
***
****
*****
******
*******
********
*********
第四步:
vim 99.sh
脚本内容:
#!/bin/bash
for i in {1..9} #列循环内容不变
do
for ((j=1; j<=i; j++))
do
echo -ne "$i*$j=$[ $i*$j ]\t" #行输出内容修改为9*9算式和结果。$[ ]表示计算里面的正整数结
果,echo -e参数表示调用转义符,\t表示制表符即循环时输出一个tab键
done
echo
done
bash 99.sh #调用shell执行脚本
输出结果:
1*1=1 -
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
二、while循环语句
2.1 执行条件
while循环满足条件执行,不满足不执行
用于不知道循环次数,需要主动结束循环或达到条件结束循环。
2.2 基本格式
while [ 判断条件]
do
执行动作 while循环执行动作
done while循环结束标志 while true
示列:
#!/bin/bash
i=0
while [ $i -le 5 ] #变量i小于等于5时执行while循环
do
echo "$i" #循环执行内容,每循环一次打印$i
let i++ #每循环一次计算一次i++即i自己+1
done #while语句结束标志
sh b.sh #调用bash执行b.sh脚本
执行结果:
0
1
2
3
4
5
2.3 死循环语句
while [1 -eq 1] 判断条件写一个永久为真的条件
do 一直执行do内的命令
done
-
while true 直接写判断条件为真
do 一直执行do内的命令
done
-
while : 判断条件为冒号也表示死循环
do 一直执行do内的命令
done
三、untli循环语句
3.1 基本格式
until循环通常用于当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环,
比如等待某个进程退出、等待某个文件被创建等等
格式示列:
until [ 条件测试操作 ]
do
判断式/命令序列
done
[root@localhost opt]# vim until.sh
i=0
sum=0
until [ $i -gt 10 ]
do
echo $i
let i++
sum=$(($sum+$i))
done