10.1 for命令---基本格式
for var in list
do
command
done
10.1.1 读取列表中的值
for test in a b c d e f g (任何空白字符都可以作为其读取的分割符)
do
echo " the next is $test "
done
10.1.2 读取列表中的复杂值
如
for test in I don't know if this'll work
do
echo " the next is $test "
done
输出
the next is I
the next is dont know if thisll
the next is work
shell 看到列表中的单引号,会试图用他们来定义一个单独的数据值,有两种方法解决
1. 使用转义字符来转义单引号
2. 使用双引号来定义使用单引号的值
for test in I don\'t know if "this'll" work
do
echo " the next is $test "
done
for循环认为每个值 都用 空格 分割,如果有包含空格的数据值 会遇到问题
for test in "New York" "New Mexico"
do
echo " the next is $test "
done
10.1.3 从变量读取列表
$ list=a b c d e f
for test in $list
do
echo " the next is $test "
done
10.1.4 从命令中读取列表
$ list="string"
for test in `cat $file`
do
echo " the next is $test "
done
10.1.5 改变字符分割符
环境变量 IFS(internal field separator ) 定义了 bash shell 用作字段分割符的字符列表,默认是
空格
字表符
换行符
如果 bash 在数据中遇到这几种字符的一种,就会认为在数据中启用新的数据字段,当处理包含
这几种字符的文档时,会产生干扰,
解决办法,暂时更改 IFS 值
IFS=$'\n' IFS 只识别 换行符
如 IFS.OLD=$IFS
IFS=$'\n'
< write your code >
IFS=IFS.OLD
-----------------------------
IFS=: 将IFS 值设置为 :
如果需要制定多个 IFS 字符
IFS=$'\n':;" 使用: ; 换行符 “ 作为字符分割符
10.1.6 使用统配符 读取目录
可以使用 for 命令 自动迭代文件目录 。为此,必须在文件或 路径中使用通配符,文件 通配,
是生成和指定统配符匹配的文件和路径的过程
for file in /home/rich/*
do
if [ -d "$file" ]
then
echo "$file" is a dir
elif [ -f "$file" ]
then
echo "$file" is a file
fi
done
10.2 c式的for 循环 ( shell 编程中尽量少用C式的 for 循环 )
for (i=0; i<10; i++ ){
<your code>
}
10.3 while 循环
10.3.1 基本形式
while 命令允许定义要测试的命令,测试命令返回 0 退出状态码,就循环一组命令,非0 时while停止执行
while test command
do
<your code>
done
done 后面可以 接输入 重定向 如 done < testfile (while 使用 换行符作为 字符分割符 )
10.3.2 使用多条测试命令
while 命令允许在 while 语句 行 定义多条 test 命令 ,
但只有最后一条测试命令的退出状态码是用来决定循环是何时停止的。
如
var1=10
while echo var1
[ var1 -ge 0 ]
do
echo "this is inside the loop"
var1=$[ $var1-1 ]
done
10.4 使用until 命令
until 命令刚好和 while 命令相反,until 需要制定一条测试命令,只有测试命令的退出状态非0,执行
循环中命令,若退出状态为0, 则循环停止
until test command
do
<your code>
done
10.5 文件数据的循环
通常需要迭代存储在文件内部的项,需要
1.使用嵌套询函
2.更改IFS 值
如
IFS.OLD=$IFS
IFS=$'\n'
for entry in 'cat /etc/passwd'
do
echo "values in $entry - "
IFS=:
for value in $entry
do
echo $value
done
done
10.6 循环控制
break ; continue
10.7 处理循环的 输出
可以在循环中使用管道 或者重定向循环输出结果,可以通过在done 命令的末尾添加处理命令
来做到
var1=10
while echo var1
[ var1 -ge 0 ]
do
echo "this is inside the loop"
var1=$[ $var1-1 ]
done > test.txt ( 将for 命令的结果 重定向到文件 test.txt )