"echo $IFS" 不返回 IFS 的值

Mar*_*tin 6 bash

我已将 设置IFSx,即IFS=x。现在,如果我检查 的值IFS,如果我不使用双引号,它似乎是空的:

~ $ echo $IFS | cat -e
$
~ $ echo "$IFS" | cat -e
x$
~ $ echo $HOME   
/home/mar
~ $ echo "$HOME"
/home/mar
~ $ 
Run Code Online (Sandbox Code Playgroud)

如上所示,$HOME行为并非如此。这种行为的原因是什么?

tal*_*zin 7

变量展开后,会发生分词并将其拆分为空词。拆分是使用IFS变量的每个字符作为分隔符完成的,并且由于$IFS仅扩展到其中的字符,因此IFS它被拆分为空词。

因此,例如:

IFS=xxx;
printf %q $IFS
''''''[root@localhost ~]#
Run Code Online (Sandbox Code Playgroud)

如果您使用双引号,则是在告诉 bash 将引号内的所有内容都视为一个词:

printf %q "$IFS"
xxx[root@localhost ~]#
Run Code Online (Sandbox Code Playgroud)


fre*_*ini 4

我想这与高级 Bash 脚本指南中的内容有关

使用双引号来防止分词。[2] 用双引号括起来的参数将自身呈现为单个单词,即使它包含空格分隔符也是如此。

结合例子(5.1):

var="'(]\\{}\$\""
echo $var        # '(]\{}$"
echo "$var"      # '(]\{}$"     Doesn't make a difference.

IFS='\'
echo $var        # '(] {}$"     \ converted to space. Why?
echo "$var"      # '(]\{}$"
Run Code Online (Sandbox Code Playgroud)