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"是换行符" " 最后一个 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脚本中用来分割某些变量还是很好用的。