关于环境变量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
posted @ 2018-05-01 17:36  simple-clean-opt  Views(2115)  Comments(0Edit  收藏  举报