文章目录
此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:
1、for 循环 语法格式:
两个 for 循环的语法格式:
#!/bin/bash
for2((expression1;expression2;expression3))
do
for1((expression1;expression2;expression3))
do
cmd1(这是 for1 的执行命令...)
done
cmd2 (这是 for2 的执行命令..)
done
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
来看一下三个 或 三个以上 的for循环的语法结构:
#!/bin/bash
for3((expression1;expression2;expression3))
do
for1((expression1;expression2;expression3))
do
cmd1(这是 for1 的执行命令...)
done
for2((expression1;expression2;expression3))
do
cmd2(这是 for2 的执行命令...)
done
cmd3 (这是 for3 的执行命令..)
done
2、for循环嵌套的执行过程:
就直接拿 三个 for 循环的语法结构来举例:
root@zhengzelin:~# cat f.sh
#!/bin/bash
for((i=1;i<=1;i++))
do
for((b=1;b<=2;b++))
do
echo "666"
done
for((c=1;c<=3;c++))
do
echo "ccc"
done
echo "ddd"
done
root@zhengzelin:~# ./f.sh
666
666
ccc
ccc
ccc
ddd
# 现在对于 for嵌套的 执行过程顺序 明白了吧!先执行哪个for 再执行哪个for 懂了吧!
使用 bash -x 看的脚本执行的更加清楚:
root@zhengzelin:~# bash -x f.sh
+ (( i=1 ))
+ (( i<=1 ))
+ (( b=1 ))
+ (( b<=2 ))
+ echo 666
666
+ (( b++ ))
+ (( b<=2 ))
+ echo 666
666
+ (( b++ ))
+ (( b<=2 ))
+ (( c=1 ))
+ (( c<=3 ))
+ echo ccc
ccc
+ (( c++ ))
+ (( c<=3 ))
+ echo ccc
ccc
+ (( c++ ))
+ (( c<=3 ))
+ echo ccc
ccc
+ (( c++ ))
+ (( c<=3 ))
+ echo ddd
ddd
+ (( i++ ))
+ (( i<=1 ))
3、利用for基础打印一个矩形:
第一步先打印 矩形的长:
root@zhengzelin:~# for((i=1;i<=1;i++));do echo "******";done
******
————————————————————————————————————————————————————————————————————————————————————————————
矩形的长出来了,然后打印矩形的宽 和 长:
root@zhengzelin:~# for((i=1;i<=2;i++));do echo "******";done
******
******
查看一下 这个命令的执行过程:
root@zhengzelin:~# bash -x f.sh
+ (( i=1 ))
+ (( i<=2 ))
+ echo '******'
******
+ (( i++ ))
+ (( i<=2 ))
+ echo '******'
******
+ (( i++ ))
+ (( i<=2 ))
4、使用 for循环嵌套 打印矩形:
root@zhengzelin:~# for((i=1;i<=2;i++));do for((a=1;a<=7;a++));do echo -n "*";done; echo ;done
*******
*******
解释:
1、上面的嵌套for循环 你先给他拆开成两个单个的 for 循环!分开为:
①、for((i=1;i<=2;i++));do echo ; done
和
②、for((a=1;a<=7;a++));do echo -n "*" ; done
2、分别执行两个 for 循环命令,查看结果:
先执行 第一个 for循环语句:
root@zhengzelin:~# for((i=1;i<=2;i++));do echo ; done
root@zhengzelin:~#
发现上面输出了两个空行,为什么是2个空行呢?因为上面规定了 i 的取值范围是 1 - 2,然后循环,每次循环都 执行一次 echo ;
echo 命令 执行的话,默认会换行!
eg:
root@zhengzelin:~# echo
root@zhengzelin:~#
再执行 第二个 for 循环语句:
root@zhengzelin:~# for((a=1;a<=7;a++));do echo -n "*" ; done
******* root@zhengzelin:~#
# 发现输出的结果没有换行,这是为什么???
解释: 这是因为 echo -n 取消了echo命令自动换行 的功能!
——————————————————————————————————————————————————————————————————————————————————————
如果第二个for循环 取消 -n ;那么结果就是:每次打印一个* 就换一次行:
root@zhengzelin:~# for((a=1;a<=7;a++));do echo "*" ; done
*
*
*
*
*
*
*
那么再来看一下,for 嵌套取消 第二个for循环中 echo 的 -n 选项;看看输出结果是啥:
root@zhengzelin:~# for((i=1;i<=2;i++));do for((a=1;a<=7;a++));do echo "*";done; echo ;done
*
*
*
*
*
*
* # 先执行 里面的for循环语句,这7个*就是输出结果!
#再执行 外面 的for循环语句,这个空格 就是 echo命令 的输出结果!
*
*
*
*
*
*
*
# 到此,循环结束!
root@zhengzelin:~#
——————————————————————————————————————————————————————————————————————————————————————————————————————
加上 -n 选项:
root@zhengzelin:~# for((i=1;i<=2;i++));do for((a=1;a<=7;a++));do echo -n "*";done; echo ;done
*******
*******
执行 过程就是 :
1、执行 echo -n "*" 1-7 次,由于 echo -n 取消了换行功能,所以得到的结果就是: *******
2、然后 执行 echo 命令,因为 echo 执行结果是 换行(\n)! 所以:
结果就是: *******\n
再次循环输出: *******\n*******\n
一共循环两次,循环完成退出循环!(嘴笨不知道如何表达,希望不会的人可以理解!)
所以说: n你知道为什么 第二个 for 循环里面要 使用 echo -n 来取消 echo 的自动换行功能 了吧!