1、基本介绍
for循环假定各个值之间是以空格、制表符或换行符分隔的,因为特殊的环境变量IFS(internal field separator,内部字段分隔符),默认情况下,它会将这三者视为字段分隔符。
格式:
for var in list
do
commands
done
for var in list; do
commands
done
#!/bin/bashfor var in Apple Banana Orange
doecho "你喜欢吃$var."
done
当在列表值中遇到单引号时,shell脚本会尝试使用它们来定义一个单独的数据值。
解决方法:
使用转义字符反斜杠\将单引号转义;
使用双引号定义含有单引号的值。
当在列表值中遇到空格时,需要用双引号。
#!/bin/bash
#当遇到单引号时,需要使用转义字符反斜杠或者使用双引号for word in I don\'t know if "this'll" work "Cheng Du"
doecho "word:$word"
done
2、从变量中读取列表的值
#!/bin/bash
list="Chengdu Chongqing Shanghai Beijing Hangzhou"
list=$list" Guangzhou" #向值列表中追加一项
for city in $list
doecho "你去过这座城市吗?$city"
done
3、从txt文档中读取值列表
此方法需要注意,txt文档中的每个值各占一行,而不能以空格分隔。如果某个值中有空格,for命令依然会用空格进行分隔。
#!/bin/bash
file="cityname.txt"
for city in $(cat $file)
doecho "这些城市值得一去:$city"
done
4、更改字段分隔符
如果想要bash shell只能识别换行符,解决方法是在shell脚本中临时更改IFS环境变量。如下所示:
#!/bin/bash
file="cityname.txt"IFS=$'\n' #临时修改IFS环境变量,使shell脚本只会将换行符视为字段分隔符for city in $(cat $file)
doecho "这些城市值得一去:$city"
done
如果要遍历文件中用冒号分隔的值,则只需将IFS的值设为冒号即可:
IFS=:
如果要指定多个IFS字符,只需在赋值语句中将这些字符写在一起:
#将换行符、冒号、分号、双引号都作为字段分隔符
IFS=$'\n:;"'
5、使用通配符读目录
可以使用for命令自动遍历目录中的文件,但必须在文件名或路径名中使用通配符,这会强制shell使用文件名通配符匹配(file globbing),文件名通配符匹配是生成与指定通配符匹配文件名或路径名的过程。
#!/bin/bash
for file in /home/user/*
doif [ -d "$file" ] #因为目录名可能会包含空格,所以需要将其放入双引号中thenecho "$file是一个目录。"elif [ -f "$file" ]#因为文件名可能会包含空格,所以需要将其放入双引号中echo "$file是一个文件。"fi
done
6、C语言风格for命令
仿C语言风格的for命令在有些地方与bash shell标准的for命令不一致:
变量赋值可以用空格;
迭代条件中的变量不以美元符号$开头;
迭代过程的算式不使用expr命令格式。
#!/bin/bash
for (( a = 1; a <= 20; a++ ))
doecho "下一个数字是:$a"
done
使用多个变量
#!/bin/bash
for (( a = 1, b=20; a<=20; a++, b-- ))
doecho "$a - $b"
done