假设文件test_crond.txt中的内容为
this is a test of crond
this is a test of crond
如果shell脚本编写如下:
#!/bin/bash
file=test_crond.txt
for line in `cat $file`
do
echo $line
done
则输出结果为
造成这个问题的原因是特殊的环境变量IFS,叫作内部字段分隔符(internal field separator)。
IFS环境变量定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字
符当作字段分隔符:空格、制表符、换行符。
如果bash shell在数据中看到了这些字符中的任意一个,它就会假定这表明了列表中一个新数
据字段的开始。
要解决这个问题,可以在shell脚本中临时更改IFS环境变量的值来限制被bash shell当作字段
分隔符的字符。脚本修改如下:
#!/bin/bash
file=test_crond.txt
IFS=$'\n'
for line in `cat $file`
do
echo $line
done
修改后的脚本,运行结果如下:
在处理文本的时候,如果要在默认IFS值和自定义IFS值之间切换,可以先将IFS默认值保存,然后再切换。
IFS.OLD=$IFS
IFS=$'\n'
# 使用换行符为IFS
IFS=IFS.OLD
# 使用默认IFS值
参考书籍《Linux命令行与shell脚本编程大全(第3版)》13.1.5节