IFS使用之道

IFS是什么鬼

IFS(Internal Field Seprator),即内部域分隔符

IFS(Internal Field Seprator),即内部域分隔符,完整定义是“The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substituioin.”

IFS查看

IFS存在于登录shell的局部环境变量中

[root@localhost ~]# set|grep IFS
IFS=$' \t\n'
[root@localhost ~]#

shell脚本中应用

通常在shell脚本中,我们会使用for遍历使用特定字符分隔的字符串,而for循环的默认分隔符是空格,这是我们就需要修改当前脚本的默认分隔符。例如,遍历如下用分号分隔的字符串

#!/bin/sh
file_name='hello.txt:world.txt:test.txt'  #被遍历的字符串
OLD_IFS=$IFS  #将默认的IFS保存到临时变量中,以便后续恢复默认值
IFS=':'  #定义新的分隔符
for i in $file_name;do
  echo $i
done
IFS=$OLD_IFS  #恢复默认的分隔符

指定的分隔符中含有转义字符

在有些情况下,我们的分隔符可能用到转义字符,录入换行符(\n)、制表符(\t)等,如果直接使用IFS='\n'或者IFS='\t'就会发生错误,这时,就需要使用$符号+单引号+转义字符的形式了,例如使用换行符作为分隔符就需要这样设置

IFS=$'\n'

例如解析某文件(slaves)中各行的值,文件内容如下

nginx
tomcat
hodoop
s100
kafka

shell脚本代码如下

#!/bin/sh
host_list=`cat slaves`
OLD_IFS=$IFS
IFS=$'\n'  #注意是单引号
for i in $host_list;do
  echo $i
done
IFS=$OLD_IFS

你可能感兴趣的:(IFS使用之道)