Shell 循环

for

语法

for name [ [in [words …] ] ; ] do commands; done

遍历words中的每一个,并执行命令。

words是一个序列,words可以使用Shell扩展生成。

for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
  1. 先执行 算术表达式expr1,初始化。
  2. 循环执行 算术表达式expr2 直到 expr2 返回 0 停止。
  3. 执行 command
  4. 执行 算术表达式 expr3

任意一个表达为空,被看作 返回值为 1。比如:expr2不填,返回为 1 != 0,会一直循环下。

返回值为:最后一次命令的退出码。任何一个表达为无效,返回 false

示例

for i in 1 2 3 4 5 6 7 8 9 10
do
  echo $i
done

for i in {1..10}
do
  echo $i
done

for (( i=0, j=0 ; i+j < 10 ; i++, j++ ))
do
  echo $((i*j))
done

while

语法

while test-commands; do consequent-commands; done

执行 consequent-commands 命令,直到 test-commands 退出码不为 0

返回值为:最后一条命令执行退出码,如果没有执行,返回 0

示例

while (( COUNT < MAX ))
do
    some stuff
    let COUNT++
done

until

语法

until test-commands; do consequent-commands; done

执行 consequent-commands 命令,直到 test-commands退出码为 0

返回值为:最后一条命令执行退出码,如果没有执行,返回 0

示例

# 实例文件:select_dir

directorylist="Finished $(for i in /*;do [ -d "$i" ] && echo $i; done)"

PS3='Directory to process? ' # 设置有帮助的选择提示
until [ "$directory" == "Finished" ]; do

    printf "%b" "\a\n\nSelect a directory to process:\n" >&2
    select directory in $directorylist; do

        # 用户输入的数字被保存在$REPLY中,
        # 但是select返回的是用户选中的选项值
        if [ "$directory" == "Finished" ]; then
            echo "Finished processing directories."
            break
        elif [ -n "$directory" ]; then
            echo "You chose number $REPLY, processing $directory..."
            # 在此进行相关处理
            break
        else
            echo "Invalid selection!"
        fi # 结束选项处理

    done # 结束目录选择处理
done # 如果用户选中Finished选项,则结束循环