循环命令用于将一个命令或一组命令执行指定的次数,或者一直执行直到满足某个条件为止。在Bash shell中常用的循环语句有,for循环,while循环,until循环

一、For循环语句

   1、For循环的语法

       for  var  in  list

        do    

             commands      

        done

   2、For循环的流程图

Shell脚本中常用的循环语句


   3、For循环举例

    1)、输入一个文件,判断文件是directory还是file


[[email protected] test]# cat 3.sh
#!/bin/sh
for file in $1
do
    if [ -d "$file" ]
    then
      echo "$file is a directory"
    elif [ -f "$file" ]
    then
       echo "$file is a file"
    fi
done
[[email protected] test]# sh 3.sh /etc/passwd
/etc/passwd is a file
[[email protected] test]# sh 3.sh /etc
/etc is a directory
[[email protected] test]#


说明:

   行3:调用了位置变量$1

   行5-11:使用if语句判断$1是文件还是目录


   2)、计算一个目录中有多少个文件


[[email protected] test]# cat 4.sh
#!/bin/bash
#
Count=0
for File in /tmp/*; do
  file $File
  Count=$[$Count+1]
done
echo "Total files: $Count."

说明:

     行7:每循环一次Count的值+1


二、While循环语句

    while命令允许定义要测试的命令,然后只要定义的测试命令返回0状态值,则执行while循环中的语句,否则直接退出

   1)、while循环的语法

       while test command

        do

            oter command

        done

  2)、while循环的流程图

Shell脚本中常用的循环语句

  3)、while循环举例

     计算100以内整数的和    

[[email protected] test]# cat 6.sh
#!/bin/sh
Sum=0
Count=1
while [ $Count -le 100 ]; do
  let Sum+=$Count
  let Count++
done
echo $Sum


    如果用户的ID号为偶数,则显示其名称和shell;对所有用户执行此操作;

[[email protected] test]# cat 5.sh
#!/bin/sh
while read LINE; do
  Uid=`echo $LINE | cut -d: -f3`
  if [ $[$Uid%2] -eq 0 ]; then
    echo $LINE | cut -d: -f1,7
  fi
done < /etc/passwd

 说明:

       行3,8:将passwd中的每一行给变量LINE赋值(由于while能读到 $LINE的值,所以判断为                   真,状态返回值为0)

       行4,5,6:取出$LINE中用户的UID并判断UID是否是偶数,如果是偶数则显示其用户名和                      shell


三、Until循环语句

   Until命令允许定义要测试的命令,然后只要定义的测试命令返回非0状态值,则执行unitl循环中的语句,否则直接退出(unitl和while刚好相反)

   1)、Until循环语句的语法


       until test command

        do

            oter command

        done

   2)、Until循环的流程图

Shell脚本中常用的循环语句

  3)Until循环举例

    计算100以内整数的和      

[[email protected] test]# cat 6.sh
#!/bin/sh
Sum=0
Count=1
until [ $Count -gt 100 ]; do
  let Sum+=$Count
  let Count++
done
echo $Sum

    每隔5秒查看hadoop用户是否登录,如果登录,显示其登录并退出;否则,显示当前时间,并说      明hadoop尚未登录:  


who | grep "^TOM" &> /dev/null
RetVal=$?
until [ $RetVal -eq 0 ]; do
  date
  sleep 5
  who | grep "^TOM" &> /dev/null
  RetVal=$?
done
echo "TOM is here."


  说明:

       行1,2:查看TOM用户是否登录,然后输出状态码

       行3:如果状态返回值等于0则不执行下面的脚本。

       行4,5:显示时间并设置sleep 5秒

       行6,7:再次检查用户TOM是否登陆