开发者学堂课程【Shell 编程入门到精通:shell循环嵌套使用方法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/453/detail/5598
shell循环嵌套使用方法
一、循环语句的嵌套
嵌套就比如一个for语句里面还有多个for语句,双重循环。
1、案例1 :打印直角三角形
使用特殊符号打印三角形。要求整个程序要有交互,运行时可以自动输入打印的行数和用于描绘三角形的特殊符号。
从Please Enter the line number:输入打印行数值5,Please Enter the line number:输入要打印的字符*,执行结果如下:
*
**
***
****
*****
思路分析:可以echo一个文件,如echo “aaaa“,read line得到一个行数。
vim 创建 sanjiao.sh,打印一个三角形,首先echo实现交互,获得*,但因为*比较特殊,是通配符,所以要打印*需要加上”$char”,再echo输出,使用$Line$char来查看有没有得到值,如,
[ root@xuegod63 test] # vim sanjao. sh
echo "Please Enter the line number:
read
Line
echo $Line
echo "Please Enter the char number:
“
read
char
echo
“
$char
“
[ root@xuegod63 test] #./sanjao. sh
Please Enter the line number:
5
5
Please Enter the char number:
*
*
使输出内容不换行:
方法一,echo后加-n,如,
[ root@xuegod63 test] # vim sanjao. sh
echo -
n
"Please Enter the line number:
read
Line
echo $Line
echo -
n
"Please Enter the char number:
“
read
char
echo
“
$char
“
[ root@xuegod63 test] #./sanjao. sh
Please Enter the line number:
5
5
Please Enter the char number:*
*或
[ root@xuegod63 test] #echo
-n
aaa
[ root@xuegod63 test] #echo
-n
aaa
aaa [ root@xuegod63
test]#
方法二:
echo * #此命令中* 表示匹配当前目录下所有文件名。echo “*“,通过read可以有交互的接收键盘上输入的值存到变量里面,接收时的提示符为-p,如,[ root@xuegod63 test] # vim sanjao. sh
#!/
bin/sh
read -p "Please Enter the line number:" Line
eqho $Line
read -p "Please Enter the
char
number:"
char
[ root@xuegod63 test] #./sanjao. sh
Please Enter the line number:
5
5
Please Enter the char number:
*
*
以上已经实现了运行时可以自动输入打印的行数和用于描绘三角形的特殊符号,接下来实现输出三角形形式的效果思路:
双重循环
外层:控制行数.
内层:控制每行输出的*的个数
观察图像发现符号输出为,第一行一个,第二行二个,第三行三个…第五行五个。规律:每行输出的*数等于行号。
找到规律后先定义一个参数a,while让$a小于等于行数$Line,比如行数$Line为5,则输出5行,do满足时定义一个变量b=1,再while$b小于等于$a,然后开始执行输出,输出-n $char,$char要加““,如”$char“,对b做赋值为$b+1为2,满足条件一直while循环, done结束,输出*后echo换行,最后a也要做赋值,增加到大于行号停止,再次done结束,保存退出,如,
[ root@xuegod63 test] # vim sanjao. sh
#!/bin/sh
read
-p "Please Enter the line number:" Line
read
-p "Please Enter the char number:”char
a=1
while [ $a -le $Line ]
do
b=1
while[$b-le $a]
do
echo -n “$char”
b='expr$b+1
‘
done
echo
a='expr $a+1
‘
done
[ root@xuegod63 test] #
.
/sanjao. sh
Please Enter the l ine number:3
Please Enter the char number:*
*
**
***
如果上述脚本echo后没有-n不换行,则输出为,
[ root@xuegod63 test]# . /sanjao.sh
Please Enter the line number:3
Please Enter the char number:*
*
*
*
*
*
*
如果外循环没有echo,执行脚本,则输出为,
[ root@xuegod63 test]# . /sanjao.sh
Please Enter the line number:3
Please Enter the char number:*
******[ root@xuegod63 test]#
此处外层循环执行一次里层循环执行$a次,可以把变量换成具体数值进行验证。
2、案例2 :打印倒三角形
打印以下倒三角形,分析a要等于3,a做自减一,$a 仍然小于$Line
***
**
*
3、案例3 :打印正三角形
想要输出以下图形:
*
***
*****
方法1:使用echo直接输出,*要加““括起来。
[ root@xuegod63 test]#
vim
zhengsj
.sh
#!/bin/sh
echo “*”
echo “***”
echo “*****”
[ root@xuegod63 test]# . /
zhengsj
.sh
*
***
*****
方法2:cat<<EOF输入重定向,EOF结尾标志符,也可用其他的,如,
[ root@xuegod63 test]#cat>>EOF
> *
> ***
> *****
>
E0F
*
***
*****
方法3 : 代码实现方法
*
***
*****
分析:
1、外层控制输出几行
2、内层循环(1) :每行输出空格的个数
内层循环(2):每行输出的*的个数
3、内层循环1 :每行输出空格的个数
#指定每一行输出的空格数。第一行需要输出2个空格第二行需要输出1个第三行输出0个空格。得出结论,空格数等于:总行数Line-当前行号。
read -p获取行号,外层循环for使用行号控制一个循环的次数,此处for做一个加深,i=1初始值,i小于等于Line,执行完后i++,这种写法类似于c语言的写法,do中的for执行输出空格数,第一行两个,第二行一个得出,空格数等于总行数line减去当前行,定义一个j,j等于$Line-$i,,当i等于1的时候说明第一次循环在第一行,这是初始值,当i等于2时,i等于2时大于0,执行j--,输出echo -n,单引号里面要加空格,执行到j减为1。
内层循环2 :每行输出的*的个数
#第一行一个*,第二行两个*,第三个5个*。每行的*数应该等于当前行号x2-1。
当h=1时,h++,直到h不小于x2-1结束,再执行echo输出*,输出时要加-n表示不换行输出,如,
[ root@xuegod63 test]#
vim
zhengsj
-
v3.
sh
#
!
/bin/sh
read -p "Please Enter a number:" Line
#获取号行
for ((i=1; i<=Line; i++))
#使用行号来控制一共循环的次数
do
for ((j=$Line-$i; j>0;j--)
)
;
#指定每一行输出的空格数。第一行需要输出2个空格,第二行需要输出1个,第三行输出0个空格。得出结论,空格数等于:总行数Line-当前行号
do
echo -n
done
for ((h=1; h<=$(2*$i-1)
)
; h++))#第一行一个*,第二行两个*,第三个5个*。每个*>
数等于
:当前行号x2-1
do
echo -n ‘*’
#输出内容时,不换行
done
echo
done
[ root@xuegod63 test]#./
zhengsj
-
v3.
sh
Please Enter a number:5
*
***
*****
*******
*********