一、for语句
语法
for var in list
do
commands
done
- list中的值默认是以空格/制表符/换行符分隔的字符串或数字,如:
for test in a b c
do
echo $test
done
- 如果列表中有单引号需要转义,ru
for test in I\'m jack
do
echo "word:$test"
done
- 如果在单独的数据值中有空格,要用双引号或单引号圈起来
for city in "New York" "New Mexico"
do
echo "city:$city"
done
- bash shell中的字段分隔符
IFS(internal field separator)环境变量定义了 bash shell 用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字符当作字段分隔符
- 空格
- 制表符
- 换行符
可以在shell脚本中通过修改IFS的值来修改默认的分隔符,最佳实践是先备份原值:
IFS.OLD = $IFS
IFS='\n'
<use the new IFS value in code>
IFS=$IFS.OLD
- 使用通配符读取目录
for file in ls /home/test/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f "$file" ]
echo "$file is a file"
fi
done
这里判断条件[ -d "$file" ] 必须加双引号,因为目录中可能包含空格等特殊字符,在test命令中,bash shell会将额外的单词当作参数,导致脚本出错。
- C语言的for命令
bash shell也支持另一个版本的for循环,看起来和C语言风格的for循环类似,格式如下:
for (( variable assignment; condition; iteration process ))
和bash shell的for循环不同之处:
- 给变量赋值可以有空格
- 条件中的变量不以美元符开头
- 迭代过程中的算式未用expr命令格式
举例
for (( i=1; i<=10; i++ ))
do
echo "the next number is $i"
done
二、while & until
- while语句格式:
while test command
do
other commands
done
while语句中的test命令和if-then语句一样。
- until语句格式
until test command
do
other commands
done
until语句和while语句相反,只有在test命令返回非零状态码时,才执行语句中的命令,一旦命令返回了退出状态码0,循环就结束了。
三、循环控制语句break和continue
3.1 break
- 跳出单个循环
- 跳出内部循环:在处理多个循环时,break语句会 自动终止你所在的最里面的循环
- 跳出外部循环:有时你在内部循环中,要终止外部循环,break命令接受单个命令行参数值:
break n
n表示要跳出的循环层数,默认时1,表明跳出当前循环。如果设置n为2, break命令会终止下一级的外部循环。
3.2 continue
跳出当前循环,继续执行下一次循环。
和break语句一样,continue命令也允许通过命令行参数指定要继续哪一级的循环
continue n
3.3 循环输出的处理
可以在done命令之后加一个重定向,将结果输出到文件中
for file in ls /home/test/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif
echo "$file is a file"
fi
done > output.txt