IFS(Internal Field Seprator)

IFS(Internal Field Seprator)

先设置个变量,然后打印出来,abcd中间为一个空格

[root@dou ~]# str1="aaa bbb ccc ddd"
[root@dou ~]# echo $str1
aaa bbb ccc ddd
[root@dou ~]# echo "$str1"
aaa bbb ccc ddd
[root@dou ~]#

然后修改变量,abcd中间空格递增,如  aaa<space>bbb<space><space>ccc<space><space><space>ddd   

[root@dou ~]# str1="aaa bbb  ccc   ddd"
[root@dou ~]# echo $str1
aaa bbb ccc ddd
[root@dou ~]# echo "$str1"
aaa bbb  ccc   ddd
[root@dou ~]#

发现问题,第一个输出不对,少了几个空格。

原因就是IFS(内部域分隔符)从中作梗,导致空格合并。

以二进制打印IFS的值看一下

[root@dou ~]# echo "$IFS" |od -b
0000000 040 011 012 012
0000004
[root@dou ~]#
"040"是空格,"011"是Tab,"012"是换行符"\n"
最后一个 012  echo 默认的换行

        IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量

        分隔符(不是所有的分隔符都会合并,空格是个例外)进行合并,所以就成了aaa<分隔符>bbb<分隔符>ccc<分隔符>ddd,.

        "" 的作用使得<space>没有进行合并转换,所以第二次输出正确。

使用IFS时建议先设置一个临时变量来保存当前值,然后自定义IFS值,使用完毕后恢复IFS初始值。不然的话后面shell脚本会出现奇奇怪怪的错误

OLD_IFS="$IFS"
IFS=","
#your script
IFS="$OLD_IFS"

IFS在shell脚本中用来分割某些变量还是很好用的。

posted @ 2020-01-15 10:25  天天开訫  阅读(446)  评论(0编辑  收藏  举报