关于环境变量IFS
1、定义
环境变量IFS,称为内部字段分隔符(internal field separator),定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字符当做字段分隔符:
- 空格
- 制表符
- 换行符
2、IFS相关的问题
如果bash shell在数据中看到了这些字符中的任何一个,它就会假定这表明了列表中一个新数据字段的开始。在处理含有空格的数据时,就会非常麻烦。
假设有一文件status.txt,其内容如下:
Alaska Arizona Arkansas Colorado Connecticut Delaware Florida Georgia New York New Hampshire North Carolina
在文件最后三行的数据中含有空格,使用for循环读取每一行时,由于空格为默认的字段分割符,bash shell遇到空格,就认为读取到一个新的字段,进而出现以下问题。
shell脚本如下:
1 #!/bin/bash 2 # 读取文件中的每一行 3 4 file="status.txt" 5 for line in $(cat ${file}) 6 do 7 echo "Visit beautiful $line" 8 done
运行结果如下:
可以看到,for循环将每个以空格隔开的单词作为单独的值,而不是将每一行作为一个单独的值。要解决这个问题,可以在shell脚本中临时改变环境变量IFS的值来限制被bash shell当做字段分隔符的字符,修改脚本如下:
1 #!/bin/bash 2 # 读取文件中的每一行 3 4 file="status.txt" 5 IFS=$'\n' 6 for line in $(cat ${file}) 7 do 8 echo "Visit beautiful $line" 9 done
再次运行脚本,结果如下:
在处理代码量较大的脚本时,可能在一个地方需要修改IFS的值,然后忽略这次修改,在脚本的其他地方继续使用IFS的默认值。一个可参考的安全实践是在改变IFS之前保存原来的IFS值,之后再恢复它,如下所示:
1 IFS.OLD=$IFS 2 IFS=$’\n’ 3 #在接下来的代码中使用新的IFS 4 #codes 5 #使用完毕后恢复IFS原来的值 6 IFS=$IFS.OLD