显示当前变量IFS
:
echo $IFS |xxd
00000000: 0a
我想将IFS
重设为默认值\t\n
。
IFS=$' \t\n'
echo $IFS |xxd
00000000: 0a
为什么不能重置IFS变量?
显示当前变量IFS
:
echo $IFS |xxd
00000000: 0a
我想将IFS
重设为默认值\t\n
。
IFS=$' \t\n'
echo $IFS |xxd
00000000: 0a
为什么不能重置IFS变量?
您正在正确重置IFS
。问题出在您的echo
中。您应该使用echo -n "$IFS" | xxd
。
看看man bash
(重点是我):
分词
shell扫描参数扩展,命令替换和算术扩展 的结果,这些结果在双引号中没有发生 用于分词。
shell将
IFS
的每个字符视为定界符,并将其他扩展的结果拆分为这些字符上的单词。 如果未设置IFS
,或者其值恰好是默认值<space><tab><newline>
,则<space>
,<tab>
和<newline>
的序列在先前扩展结果的开头和结尾处,将被忽略 ,并且不在开头或结尾处的IFS
字符的任何序列都用于分隔单词。如果IFS
的值不是默认值,则只要单词的开头和结尾都忽略空格字符space
和tab
的序列,IFS
的值(一个IFS
空格字符)。IFS
中不是IFS
空格的任何字符,以及任何相邻的IFS
空格字符,都将分隔字段。IFS
个空白字符序列也被视为定界符。如果IFS
的值为空,则不会发生单词拆分。
由于您没有对IFS
进行双引号处理,因此它会通过Shell的分词逻辑进行处理。由于根据定义,IFS
本身包含IFS
个字符,因此Shell会忽略它们。双引号可以防止这种情况。