Shell 循环
for
语法
for name [ [in [words …] ] ; ] do commands; done
遍历words中的每一个,并执行命令。
words是一个序列,words可以使用Shell扩展生成。
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
- 先执行 算术表达式
expr1
,初始化。 - 循环执行 算术表达式
expr2
直到expr2
返回0
停止。 - 执行
command
。 - 执行 算术表达式
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选项,则结束循环