for循环格式
基本格式
for 变量名称(注意是名称不是变量$等) [ in 名称范围 ] (可以不写)
do
执行内容 (若满足循环则做什么动作)
done (for循环结束标志)
名称范围是字符
[root@server1 ~]# ./for_test.sh
1
2
3
4
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for i in {1,2,3,4}
doecho "$i"
done
名称范围是一个文件
[root@server1 ~]# ./for_test.sh
a
b
c
d
e
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for i in `cat 1.txt`
doecho "$i"
done
[root@server1 ~]# cat 1.txt
a
b
c
d
e
类C语言格式
for (( 表达式1 ;表达式2;表达式3 ))
do
执行内容 (若满足循环则做什么动作)
done (for循环结束标志)
[root@server1 ~]# ./for_test.sh
1
2
3
4
5
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=5;i++))
doecho "$i"
done
seq
seq 是一个 Linux/Unix 命令,用于生成一个序列(sequence)并打印出来。
格式
seq 2 (起始数) 2(间隔数) 10(终止数)
[root@server1 ~]# seq 2 2 10
2
4
6
8
10
[root@server1 ~]# seq 10 -2 1
10
8
6
4
2
seq结合for循环
[root@server1 ~]# ./for_test.sh
1
3
5
7
9
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for i in `seq 1 2 10`
doecho "$i"
done
跳出循环
break和continue命令是控制循环流程重要命令。
continue跳出循环
continue跳出循环:满足continue条件时跳出循环,但是不影响后续循环执行。
它的作用是在循环内部跳过本次循环并继续下一次循环
[root@server1 ~]# ./for_test.sh
1
3
5
9
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for i in `seq 1 2 10`
doif [ $i -eq 7 ]thencontinuefiecho "$i"
done
continue [数字] 是一个 Shell 中的控制结构,当数字是2时,它的作用是在循环内部跳过本次循环并继续下一次循环,而且会跳过两层循环,即在两层循环内部执行。
[root@server1 ~]# ./for_test.sh
1
1
1
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=3;i++))
dofor ((j=1;j<=3;j++))doif [ $j -eq 2 ]thencontinue 2fiecho "$j"done
done
break跳出循环
break跳出循环:break直接结束此次循环,但是不影响外边嵌套的循环。
[root@server1 ~]# ./for_test.sh
1
2
1
2
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=2;i++))
dofor ((j=1;j<=4;j++))doif [ $j -eq 3 ]thenbreakfiecho "$j"done
done
break [数字] 结束数字中的几次循环
[root@server1 ~]# ./for_test.sh
1
2
[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=2;i++))
dofor ((j=1;j<=4;j++))doif [ $j -eq 3 ]thenbreak 2fiecho "$j"done
done
echo相关的常用转义字符
echo -n 表示不换行输出。
[root@server1 ~]# ./for_test.sh
123123[root@server1 ~]# cat for_test.sh
#!/bin/bash
for ((i=1;i<=2;i++))
dofor ((j=1;j<=3;j++))doecho -n "$j"done
done
echo -e 输出转义字符,将转义后的内容输出到屏幕上, 只有加了-e才能执行下面的转义符。
常用转义符:
\b转义后是一个退格符(Backspace),用于将光标向前移动一个位置,但不删除该位置上的字符。不过,当输出到终端时,实际的效果可能会受到终端如何处理退格符的影响。
[root@server1 ~]# echo -e "1234a"
1234a
[root@server1 ~]# echo -e "1234\ba"
123a
[root@server1 ~]# echo -e "1234\b\ba"
12a4
\c 转义后表示不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。
[root@server1 ~]# echo -e "1234\c"
1234[root@server1 ~]#
[root@server1 ~]# echo -e "12\c34"
12[root@server1 ~]#
\n 转义后表示换行,被输出的字符从"\n"处开始另起一行。
[root@server1 ~]# echo -e "12\n34"
12
34
\f 转义后是一个表单馈送符(Form Feed),通常用于在打印输出中将纸张向前移动到下一页的开始,或者在终端中,它通常用于清除屏幕并移动光标到屏幕的左上角(尽管这个行为可能会根据终端的不同而有所差异)。
\v 转义后是一个垂直制表符(Vertical Tab),它在输出中通常用于在垂直方向上移动光标到下一个制表位置。
[root@server1 ~]# echo -e "1234\v1234"
12341234
\t 转以后表示插入tab,即横向制表符(tab)。
[root@server1 ~]# echo -e "1234\t1234"
1234 1234
\r 转以后表示光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
[root@server1 ~]# echo -e "1234\rabcd"
abcd
[root@server1 ~]# echo -e "1234\rab"
ab34
使用for循环和echo相关的常用转义字符打印一张出九九乘法表
1.打印一个9*9的正方形队列
[root@server1 ~]# ./99_test.sh
*********
*********
*********
*********
*********
*********
*********
*********
*********
[root@server1 ~]# cat 99_test.sh
#!/bin/bash
for ((i=1;i<=9;i++))
dofor ((j=1;j<=9;j++))doecho -n "*"done
echo #用于换行
done
2.砍半
[root@server1 ~]# ./99_test.sh
*
**
***
****
*****
******
*******
********
*********
[root@server1 ~]# cat 99_test.sh
#!/bin/bash
for ((i=1;i<=9;i++))
dofor ((j=1;j<=i;j++))doecho -n "*"done
echo #用于换行
done
3.填入内容
[root@server1 ~]# ./99_test.sh
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
1*5=52*5=103*5=154*5=205*5=25
1*6=62*6=123*6=184*6=245*6=306*6=36
1*7=72*7=143*7=214*7=285*7=356*7=427*7=49
1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64
1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81
[root@server1 ~]# cat 99_test.sh
#!/bin/bash
for ((i=1;i<=9;i++))
dofor ((j=1;j<=i;j++))doecho -n "$j*$i=$(($j*$i))"done
echo #用于换行
done
4.调整格式
[root@server1 ~]# ./99_test.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
[root@server1 ~]# cat 99_test.sh
#!/bin/bash
for ((i=1;i<=9;i++))
dofor ((j=1;j<=i;j++))doecho -ne "$j*$i=$(($j*$i))\t"done
echo #用于换行
done
完成。