for命令
基本格式如下
for var in
do
commands
done
- 读取列表中的值
#!/bin/bash
for test in Alabama Alaska Arizona Arkansas California Colorado
do
echo $test
done
- 读取列表中的复杂值
注意如列表中,一些符号注意使用转义符来转义或双引号来表示,如
#!/bin/bash
for test in i don\'t know if "this'll" work
do
echo $test
done
如果想打印一些有空格的值,看一个栗子
#!/bin/bash
for test in China "New York"
do
echo $test
done
- 从变量中读取列表
shell脚本中经常发生的是积累了存储于变量中的一个值的列表,然后需要通过列表迭代,例如
list="Alabama Alaska Arizona Arkansas California Colorado"
#以下为常用语句
list=$list" Connectioncut"
for state in $list
do
echo $state
done
- 读取命令中的值
生成列表中使用的值的另一种方法是使用命令的输出,见下
file="states"
#千万注意反引号和单引号
for state in `cat $file`
do
echo $state
done
其中states文件为:
Alabana
Alaska
New York
North Hampshire
会看到打印的值并不是你想要的
- 改变字段分割值
IFS:内部字段分割符。特殊的环境变量IFS定义了bash shell用作字段分割符的字符列表。默认情况下,bash shell将下面的字符看作字段分割符:
1. 空格
2. 制表符
3. 换行符
如果bash shell在数据中遇到这几种字符中的一种,它就会认为你正在列表中启动新的数据字段。当处理能够包含空格的是数据时,就会产生干扰,如前的示例所示。
要解决该问题,可以在shell脚本中暂时更改环境变量IFS的值,限制bash shell看作是字段分隔符的字符,如若只想将IFS的值更改为只识别换行符,需要这样做:
IFS=$’\n’
在脚本中添加这条语句后,通知bash shell在数据值中忽略空格和制表符。看下面的栗子
file="states"
IFS=$'\n'
for state in `cat $file`
do
echo $state
done
警告:当使用较长的脚本时,可能在一个位置更改了IFS的值,但忘记了该值,并在脚本的其他地方假设为默认值。一个安全的做法是,在更改了原始IFS值之前将它保存起来,当需要运用时回复即可,如下
IFS.OLD=$IFS
IFS=$'\n'
<use the new IFS value in code>
IFS=IFS.OLD
环境变量IFS有其他的很好应用,如果想迭代文件中用冒号分割的值(如在文件/etc/passwd中),需要做的就是将IFS设置为冒号:
IFS=:
如果想指定多个IFS字符,只需将它们在赋值行中串联起来即可
IFS=$’\n’:;”
该赋值使用了换号符、冒号、分号和双引号字符作为字段分割符。
- 使用通配符读取目录
可以使用for命令自动迭代文件的目录。如下
#!/bin/bash
#rich为用户名
for file in /home/rich/test/*
do
if [ -d "$file" ]
then
echo "$file is a dir"
elif [ -f "$file" ]
then
echo "$file is a file"
fi
done
注意在本例中对if语句测试中做了一些不同的处理,如
if [ -d "$file" ]
为什么呢?在Linux中,包含空格的路径和文件名是合法的。要容纳它们,应该使用双引号将变量$file包围起来。如果不这样做,遇到包含空格的路径或文件名就会出错