你经常需要遍历文件中保存的数据。这要求综合运用两种技术。
- 使用嵌套循环。
- 修改IFS环境变量。
通过修改IFS环境变量,能强制for命令将文件中的每一行都作为单独的条目来处理,即便数据中有空格也是如此。从文件中提取出单独的行后,可能还得使用循环来提取行中的数据。
典型的例子是处理/etc/passwd文件。这要求你逐行遍历该文件,将IFS变量的值改成冒号,以便分隔开每行中的各个字段。
具体做法如下:
#!/bin/bash
# changing the IFS value
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
这个脚本使用了两个不同的IFS值来解析数据。第一个IFS值解析出/etc/passwd文件中的各行。内层for循环接着将IFS的值修改为冒号,以便解析出/etc/passwd文件各行中的字段。
运行该脚本会得到如下输出:
Values in rich:x:501:501:Rich Blum:/home/rich:/bin/bash -
rich
x
501
501
Rich Blum
/home/rich
/bin/bash
...
内层循环会解析出/etc/passwd文件各行中的字段。这也是处理逗号分隔数据的好方法,在导入电子表格数据时经常用到。