温故知新2
时间:2010-09-24 来源:csbird
1、shell脚本的for语句的基本格式
for var in list
do
commands
done
这里的list是一串用空格(空格、tab字符、换行符)分开的值,也可以是其他命令产生的列表值。
可以通过修改环境变量IFS的值来使得for语句可以处理其他分隔符的列表,比如/etc/passwd的值是用冒号分开的,
设置IFS=$'\n':,分割符为回车和冒号。每次修改IFS的值之前最好先保存原来的值,在你的处理过程结束后再把它恢复
IFS.OLD=$IFS
IFS=$'\n':
#your processing code
IFS=$IFS.OLD
for语句支持c形式的循环,基本格式:
for ((variable assignment; condition; iteration process))
比如 for ((a = 1; a < 10; a++))。这里有几个跟通常的bash标准不同的地方:
变量赋值可以包含空格;条件表达式中的变量引用不需要$符号;最后的循环迭代部分不需要使用expr命令的格式。
另外在c形式的for循环语句中可以使用多个变量:
for ((a=1,b=10;a<=10;a++,b--))
2、break和continue
break可以结束当前的循环;在嵌套循环中,可以用break n语句跳出外部的循环,这里的n为要跳出的循环的层数,
默认值为1,即当前循环。例如:
for((a=1;a<4;a++))
do
for((b=1;b<100;b++))
do
if [ $b -gt 4]
then
break 2
done
done
当b>4时会结束整个循环。
continue也类似。
3、可以把循环块的输出进行重定向,或者用管道传给其他命令:
for ...
do
echo "hello"
done > output.txt
while ...
do
echo "hello"
done | sort
4、一个小技巧:
在处理文本文件时,常常需要先以行为单位来处理,然后对每一行用指定的分隔符再处理,比如读取/etc/passwd文件:
IFS.OLD=$IFS
#分割符设为换行符,先以行为单位处理
IFS=$'\n'
for line in `cat /etc/passwd`
do
#每一行的值用冒号分隔
IFS=:
for value in $line
do
#your processing code
done
done
IFS=$IFS.OLD
注意这里的环境变量IFS的使用