shell里面有一个特殊的环境变量叫IFS,即内部字段分隔符(internal field separator)。IFS环境变量定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将空格、制表符或者换行符作为字段分隔符。如果bash shell在数据中看到这些字符中的任意一个,它就会假定你在列表中开始了新的数据段。
如果要将文本数据中的一行作为一个数据段,那么可以修改IFS的值使其只能识别换行符,即:
IFS=$'\n'
如果要遍历一个文件(如/etc/passwd文件)中用冒号分隔的值,可以将IFS值设为冒号:
IFS=:
如果要指定多个IFS字符,只要将它们的串起来即可:
IFS=$'\n:;"' #这个赋值是将换行符、冒号、分号和双引号作为字段分隔符
需要注意的是:在处理长脚本时,可能在一个地方修改了IFS值,然后忘记它了并在其他地方以为是默认值。因此,需要在改变IFS之前保存原来的IFS值。脚本编程时,可以这样:
IFS.OLD=$IFS
IFS=$'\n'
<use the new IFS value in code>
IFS=$IFS.OLD
如果要将文本数据中的一行作为一个数据段,那么可以修改IFS的值使其只能识别换行符,即:
IFS=$'\n'
如果要遍历一个文件(如/etc/passwd文件)中用冒号分隔的值,可以将IFS值设为冒号:
IFS=:
如果要指定多个IFS字符,只要将它们的串起来即可:
IFS=$'\n:;"' #这个赋值是将换行符、冒号、分号和双引号作为字段分隔符
需要注意的是:在处理长脚本时,可能在一个地方修改了IFS值,然后忘记它了并在其他地方以为是默认值。因此,需要在改变IFS之前保存原来的IFS值。脚本编程时,可以这样:
IFS.OLD=$IFS
IFS=$'\n'
<use the new IFS value in code>
IFS=$IFS.OLD
参考文献:《Linux Command Line and Shell Scripting Bible》 by Richard Blum