shell基础之三:循环语句for,while,until

一、循环语句: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]#




     

你可能感兴趣的:(while,for,until)