控制圈while/until

http://www.openchess.org/noitatsko/programming/

while list do list done
当list为True时,该圈会不停地执行。
例一 : 无限回圈写法
#!/bin/sh
while : ; do
echo "do something forever here"
sleep 5
done
例二 : 强迫把pppd杀掉。
#!/bin/sh
while [ -f /var/run/ppp0.pid ] ; do
killall pppd
done
--------------------------------------------------------------------------------
until list do list done
当list为False(non-zero)时,该圈会不停地执行。
例一 : 等待pppd上线。
#!/bin/sh
until [ -f /var/run/ppp0.pid ] ; do
sleep 1
done

 » 相关连接:
参数与变数 函数function Bash内建指令集 Bash最常见的激活模式
Bash中的变量 Bash中的特殊字符 Shell编程经典教程 bash内建的参数
shell中<>的用法 shell脚本调试。 命令行参数 until循环
[回复]
9.2.1. 什么是while循环?

while 结构允许重复执行一系列命令,只要控制 while 循环的命令执行成功(退出状态是零)。语法是:

while CONTROL-COMMAND; do CONSEQUENT-COMMANDS; done

CONTROL-COMMAND 可以是任何可以返回成功或者失败状态的命令(组)。CONSEQUENT-COMMANDS 可以使任何程序,脚本或者shell结构。

只要 CONTROL-COMMAND 一失败,循环就退出。在一个脚本当中,跟随 done 语句的命令就执行。

返回状态是最后的 CONSEQUENT-COMMANDS 命令的退出状态,如果什么都没有执行就是零。
9.2.2. 例子
9.2.2.1. 使用while的简单例子

这里是一个为 impatient的例子:

#!/bin/bash

# This script opens 4 terminal windows.

i="0"

while [ $i -lt 4 ]
do
xterm &
i=$[$i+1]
done

9.2.2.2. 嵌套while循环

下面的例子是拷贝在web目录中由摄像头生成的图片。每5分钟就生成一张图片。每1个小时,就建立一个新的目录,存放那个小时中的图片。每天一个新的包含24个子目录的目录就被创建。脚本在后台运行。

#!/bin/bash

# This script copies files from my homedirectory into the webserver directory.
# (use scp and SSH keys for a remote directory)
# A new directory is created every hour.

PICSDIR=/home/carol/pics
WEBDIR=/var/www/carol/webcam

while true; do
    DATE=`date +%Y%m%d`
    HOUR=`date +%H`
    mkdir $WEBDIR/"$DATE"
   
    while [ $HOUR -ne "00" ]; do
        DESTDIR=$WEBDIR/"$DATE"/"$HOUR"
        mkdir "$DESTDIR"
        mv $PICDIR/*.jpg "$DESTDIR"/
        sleep 3600
        HOUR=`date +%H`
    done
done

注意 true 语句的使用。意味着:直到我们强制中断否则就继续执行。(使用 kill 或者 Ctrl+C)。

这个小脚本可以用来模拟测试;生成文件:

#!/bin/bash

# This generates a file every 5 minutes

while true; do
touch pic-`date +%s`.jpg
sleep 300
done

注意使用 date 命令来生成各种文件和目录名字的用法。更多请见帮助页面。
[注意]     Use the system

先前的例子是为了证明。普通的检查能很容易地使用系统自带的 cron 工具来完成。当从crontab来执行的时候不要忘了重定向输出和错误!
9.2.2.3. 使用键盘输入来控制while循环

这个脚本可以由用户用 Ctrl+C 来中断:

#!/bin/bash

# This script provides wisdom

FORTUNE=/usr/games/fortune

while true; do
echo "On which topic do you want advice?"
cat << topics
politics
startrek
kernelnewbies
sports
bofh-excuses
magic
love
literature
drugs
education
topics

echo
echo -n "Make your choice: "
read topic
echo
echo "Free advice on the topic of $topic: "
echo
$FORTUNE $topic
echo

done

一个 here 文档用来提示用户可能的选择项。再次,true 一次又一次地重复测试 CONSEQUENT-COMMANDS 中的命令。
9.2.2.4. 计算一个平均数

这个脚本在运算之前先进行测试,然后计算用户输入的平均数:如果输入不在允许范围内,就打印一条消息。如果按下 q 就退出循环:

#!/bin/bash

# Calculate the average of a series of numbers.

SCORE="0"
AVERAGE="0"
SUM="0"
NUM="0"

while true; do

  echo -n "Enter your score [0-100%] ('q' for quit): "; read SCORE;

  if (("$SCORE" < "0"))  || (("$SCORE" > "100")); then
    echo "Be serious.  Common, try again: "
  elif [ "$SCORE" == "q" ]; then
    echo "Average rating: $AVERAGE%."
    break
  else
    SUM=$[$SUM + $SCORE]
    NUM=$[$NUM + 1]
    AVERAGE=$[$SUM / $NUM]
  fi

done

echo "Exiting."

注意在最后几行中变量是如何解除引用来达到运算的目的。

 » 相关连接:
参数与变数 函数function Bash内建指令集 Bash最常见的激活模式
Bash中的变量 Bash中的特殊字符 Shell编程经典教程 bash内建的参数
shell中<>的用法 shell脚本调试。 命令行参数 until循环
[回复]
9.3.1. 什么是until循环?

until 循环和 while 循环非常相似, 除了循环执行直到 TEST-COMMAND 执行成功。只要这个命令测试失败,循环就继续。语法和 while 循环一样:

until TEST-COMMAND; do CONSEQUENT-COMMANDS; done

返回状态是最后一个在列表 CONSEQUENT-COMMANDS 中执行的命令的退出状态,或者没有执行的话就是零。 TEST-COMMAND 可以,again, 是任何能退出带成功或者失败状态的命令,而 CONSEQUENT-COMMANDS 可以是任何UNIX命令,脚本或者shell结构。

和我们先前已经解释的一样,“;” 出现的地方可以用一个或者更多新行来替代。
9.3.2. 例子

改进的 picturesort.sh 脚本 (参见 第 9.2.2.2 节 “嵌套while循环”),测试现存的磁盘空间。如果没有足够的磁盘空间,就删除之前月份的图片:

#!/bin/bash

# This script copies files from my homedirectory into the webserver directory.
# A new directory is created every hour.
# If the pics are taking up too much space, the oldest are removed.

while true; do
    DISKFUL=$(df -h $WEBDIR | grep -v File | awk '{print $5 }' | cut -d "%" -f1 -)

    until [ $DISKFUL -ge "90" ]; do

            DATE=`date +%Y%m%d`
            HOUR=`date +%H`
            mkdir $WEBDIR/"$DATE"
                                                                               
            while [ $HOUR -ne "00" ]; do
                    DESTDIR=$WEBDIR/"$DATE"/"$HOUR"
                    mkdir "$DESTDIR"
                    mv $PICDIR/*.jpg "$DESTDIR"/
                    sleep 3600
                    HOUR=`date +%H`
            done

    DISKFULL=$(df -h $WEBDIR | grep -v File | awk '{ print $5 }' | cut -d "%" -f1 -)
    done

    TOREMOVE=$(find $WEBDIR -type d -a -mtime +30)
    for i in $TOREMOVE; do
        rm -rf "$i";
    done

done

注意 HOUR 和 DISKFULL 变量的初始化以及 ls 和 date 带选项用法如何得到正确的 TOREMOVE 列表。

 » 相关连接:
参数与变数 函数function Bash内建指令集 Bash最常见的激活模式
Bash中的变量 Bash中的特殊字符 Shell编程经典教程 bash内建的参数
shell中<>的用法 shell脚本调试。 命令行参数 until循环
 » 本栏目最新帖:

Powered by PHPWind v6.0 Code © 2003-08