回圈(loop)

while...do...done, until...do...done (不定回圈)

『当 condition 条件成立时,就进行回圈,直到 condition 的条件不成立才停止』

while [ condition ]  <==中括号内的状态就是判断式 
do            <==do 是回圈的开始!
    程序段落
done          <==done 是回圈的结束
s=0  # 这是加总的数值变量
i=0  # 这是累计的数值,亦即是 1, 2, 3....
while [ "$i" != "100" ]
do
    i=$(($i+1))   # 每次 i 都会添加 1 
    s=$(($s+$i))  # 每次都会加总一次!
done
echo "The result of '1+2+3+...+100' is ==> $s"

『当 condition 条件成立时,就终止回圈, 否则就持续进行回圈的程序段。』

until [ condition ]
do
    程序段落
done
until [ "$yn" == "yes" -o "$yn" == "YES" ]
do
    read -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input the correct answer."

for...do...done (固定回圈): 帐号检查, 网络状态 $(seq )

相对於 while, until 的回圈方式是必须要『符合某个条件』的状态, for 这种语法,则是『 已经知道要进行几次回圈』的状态!他的语法是:

for var in con1 con2 con3 ...
do
    程序段
done
users=$(cut -d ':' -f1 /etc/passwd)  # 撷取帐号名称
for username in $users               # 开始回圈进行!
do
        id $username
        finger $username
done

举例来说,我想要利用 ping 这个可以判断网络状态的命令, 来进行网络状态的实际侦测时,我想要侦测的网域是本机所在的 192.168.1.1~192.168.1.100,由於有 100 台主机, 总不会要我在 for 后面输入 1 到 100 吧?此时你可以这样做:

network="192.168.1"              # 先定义一个网域的前面部分!
for sitenu in $(seq 1 100)       # seq 为 sequence(连续) 的缩写之意
do
    # 底下的程序在取得 ping 的回传值是正确的还是失败的!
        ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
    # 开始显示结果是正确的启动 (UP) 还是错误的没有连通 (DOWN)
        if [ "$result" == 0 ]; then
                echo "Server ${network}.${sitenu} is UP."
        else
                echo "Server ${network}.${sitenu} is DOWN."
        fi
done

上面这一串命令运行之后就可以显示出 192.168.1.1~192.168.1.100 共 100 部主机目前是否能与你的机器连通!

判断式加上回圈的功能:

# 1. 先看看这个目录是否存在啊?
read -p "Please input a directory: " dir
if [ "$dir" == "" -o ! -d "$dir" ]; then
    echo "The $dir is NOT exist in your system."
    exit 1
fi

# 2. 开始测试文件罗~
filelist=$(ls $dir)        # 列出所有在该目录下的文件名称
for filename in $filelist
do
    perm=""
    test -r "$dir/$filename" && perm="$perm readable"
    test -w "$dir/$filename" && perm="$perm writable"
    test -x "$dir/$filename" && perm="$perm executable"
    echo "The file $dir/$filename's permission is $perm "
done

for...do...done 的数值处理

for (( 初始值; 限制值; 运行步阶 ))
do
    程序段
done
read -p "Please input a number, I will count for 1+2+...+your_input: " nu

s=0
for (( i=1; i<=$nu; i=i+1 ))
do
    s=$(($s+$i))
done
echo "The result of '1+2+3+...+$nu' is ==> $s"