一、循环语句:for
什么是循环语句?
实现重复计算和操作的语句。即解决循环问题的语句。许多高级语言中都有好几种循环语句。一般均设置一个退出或进入循环的条件来控制循环的次数
循环控制语句:for
for循环语法:
for 变量名 in 列表;do
循环体
done
进入条件:列表非空
退出条件:列表遍历结束
运行特性:
第一遍:将列表中的第一个元素赋值“变量名”定义的变量,而后执行完成循环体;
第二遍:、、、直到元素遍历结束,循环退出
列表的生成方式:
1、直接列出 如: stu100 stu101 stu102 或{stu100,stu101,stu102}
2、生成整数列表 如:{start_num..end_num} 例:{1..10} 特定格式,表示1到10
3、使用文件名通配的机制生成列表
4、使用命令生成
seq LAST
seq FIRST LAST
seq FIRST STEP LAST
例:
[root@localhost ~]# seq 1 2 10 1 3 5 7 9 [root@localhost ~]#
练习:
1、创建10个用户user10-user19,密码同用户名,在/tmp/创建10个空文件file10-file19,把file10-file19属主属组改为user10-user19
[root@localhost script]# cat 5useradd.sh #/bin/bash for i in {10..19} do useradd user$i touch /tmp/file$i chown user$i:user$i /tmp/file$i done [root@localhost script]#
2、写一个脚本用file命令显示/var/log目录下每个文件的内容类型。
[root@xxj shell]# cat 3.sh #!/bin/bash for i in /var/log/* do file $i done
3、显示/etc/passwd中第3,7和11个用户的用户名 和ID号
[root@xxj shell]# cat 6.sh #!/bin/bash for i in {3,7,11} do head -$i /etc/passwd|tail -1|cut -d: -f1,3 done [root@xxj shell]# bash 6.sh daemon:2 shutdown:6 operator:11
4、显示/etc/passwd文件中位于偶数行的用户的用户名
[root@localhost script]# cat 4useradd.sh #/bin/bash lines=$(cat /etc/passwd|wc -l) for i in $(seq 2 2 $lines) do head -n $i /etc/passwd|tail -1|cut -d: -f1 done [root@localhost script]# bash 4useradd.sh bin adm sync halt uucp games ftp dbus rpc rpcuser haldaemon saslauth sshd oprofile xj stu101 stu105 stu107 stu111 stu120 stu122 stu131 usersb usersib userx111 userj333x111 [root@localhost script]# bash 4useradd.sh|wc -l 26 [root@localhost script]#
5、 计算100以内所有正整数之和:
[root@xxj shell]# cat 8.sh #!/bin/bash sum=o for i in {1..100} do sum=$[$sum+$i] done echo $sum [root@xxj shell]# bash 8.sh 5050
6、计算1000以内所有偶数之和
使用至少三种方式实现
(1)、[root@BAIYU_110 shell]# cat 5.sh #!/bin/bash # y=0 for i in $(seq 2 2 100) do y=$[$y+$i] done echo "The sum is $y" [root@BAIYU_110 shell]# bash 5.sh The sum is 2550
(2)、[root@BAIYU_110 shell]# cat 5.sh #!/bin/bash # y=0 for i in $(seq 2 2 100) do let y+=$i # 或 declare -i y+=$i done echo "The sum is $y" [root@BAIYU_110 shell]# bash 5.sh The sum is 2550
(3)、[root@BAIYU_110 shell]# cat 5.sh #!/bin/bash # y=0 for i in {1..100} # for里面嵌套if语句 do if [ $[$i%2] -eq 0 ] then y=$[$y+$i] fi done echo "The sum is $y" [root@BAIYU_110 shell]# bash 5.sh The sum is 2550
7、写一个脚本,打印九九乘法表
提示:1x1=1
1x2=2 2x2=4
1x2=2 2x3=6 3x3=9
[root@BAIYU_110 shell]# cat 6.sh #!/bin/bash # for x in {1..9} do for y in $(seq 1 $x) # 循环嵌套,注意:seq 1 1 可以,{1..1}不行 do echo -n -e "${y}x${x}=$[$y*$x]\t" done echo done [root@BAIYU_110 shell]# bash 6.sh 1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
二、循环语句while,until
while
语法:
while CONDITION;do
循环体
控制变量的修正表达式
done
进入条件:当CONDITON为“真”
退出条件:当CONDITION为“假”
例:求100以内所有正整数之和
[root@BAIYU_110 shell]# cat 8.sh #!/bin/bash # declare -i y=0 declare -i i=1 while [ $i -le 100 ] do y=$[$y+$i] let i++ done echo "The sum is $y" [root@BAIYU_110 shell]# bash 8.sh The sum is 5050
打印九九乘法表
[root@BAIYU_110 shell]# cat 9.sh #!/bin/bash # declare -i x=1 declare -i y=1 while [ $x -le 9 ];do while [ $y -le $x ]; do echo -n -e "${y}x${x}=$[$y*$x]\t" let y++ done echo let y=1 let x++ done [root@BAIYU_110 shell]# bash 9.sh 1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81 [root@BAIYU_110 shell]#
until:
语法:
while CONDITION;do
循环体
控制变量的修正表达式
done
进入条件:当CONDITION为“假”时
退出条件:当CONDITION为“真”时
例:求100以内所有正整数之和
[root@BAIYU_110 shell]# cat 10.sh #!/bin/bash # declare -i x=1 declare -i y=0 until [ $x -gt 100 ];do y=$[$y+$x] let x++ done echo "The sum is $y" [root@BAIYU_110 shell]# bash 10.sh The sum is 5050
打印九九乘法表
[root@BAIYU_110 shell]# cat 11.sh #!/bin/bash #这遍终于自己写对了,不容易啊,,,, # declare -i x=1 declare -i y=1 until [ $x -gt 9 ];do until [ $y -gt $x ];do echo -n -e "${y}x${x}=$[$y*$x]\t" let y++ done echo declare y=1 let x++ done [root@BAIYU_110 shell]# bash 11.sh 1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81 [root@BAIYU_110 shell]#
循环控制:
continue [n]:提前结束循环,而直接进入下一轮
break [n]:提前结束脚本
后面接数字表示跳过或结束本循环和外面的父循环总共n个循环
[root@BAIYU_110 shell]# cat 6.sh #!/bin/bash # for x in {1..9} do for y in $(seq 1 $x) do echo -n -e "${y}x${x}=$[$y*$x]\t" done continue echo; done [root@BAIYU_110 shell]# bash 6.sh # 脚本运行遇到continue进直接进入下一次循环, 1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81 [root@BAIYU_110 shell]# [root@BAIYU_110 shell]# cat 6.sh #脚本运行遇到break就结束脚本 #!/bin/bash # for x in {1..9} do for y in $(seq 1 $x) do echo -n -e "${y}x${x}=$[$y*$x]\t" done break echo; done [root@BAIYU_110 shell]# bash 6.sh 1x1=1 [root@BAIYU_110 shell]#