使用 IFS 变量切换 Bash 分隔符

在 Linux 中 IFS 是分隔符的意思,我们可以通过 set|grep ^IFS 可以看到它的默认值:

huangzz@ZHAN-20221123:~$ set|grep ^IFS
IFS=$' \t\n'
huangzz@ZHAN-20221123:~$

可以看到,IFS 是以空格、制表符、换行符来进行分隔的,并且可以同时匹配。如下:

# 空格匹配
huangzz@ZHAN-20221123:~$ a='a b c d e f g'
huangzz@ZHAN-20221123:~$ for i in $a;do echo $i;done
a
b
c
d
e
f
g
huangzz@ZHAN-20221123:~$
# 换行符匹配
huangzz@ZHAN-20221123:~$ a='abc
> def
> ghi'
huangzz@ZHAN-20221123:~$ for i in $a;do echo $i;done
abc
def
ghi
huangzz@ZHAN-20221123:~$
# 空格和换行符同时匹配
huangzz@ZHAN-20221123:~$ a='a b c
> def
> g h i'
huangzz@ZHAN-20221123:~$ for i in $a;do echo $i;done
a
b
c
def
g
h
i
huangzz@ZHAN-20221123:~$

这种情况下会造成一个困扰,就是本来想按行分隔的,但因为有一行字符出现了空格,导致这行被再次分割,造成数据不准确的问题。要想解决这个问题,我们就需要改变 IFS 这个分隔符变量。如下:

# 只按换行分隔
huangzz@ZHAN-20221123:~$ IFS='\n'
huangzz@ZHAN-20221123:~$ a='a b c
> def
> g h i'
huangzz@ZHAN-20221123:~$ for i in $a;do echo $i;done
a b c
def
g h i
huangzz@ZHAN-20221123:~$
# 只按逗号分隔
huangzz@ZHAN-20221123:~$ IFS=','
huangzz@ZHAN-20221123:~$ a='a b c d,e f g'
huangzz@ZHAN-20221123:~$ for i in $a;do echo $i;done
a b c d
e f g
huangzz@ZHAN-20221123:~$

The End~