“echo $IFS”不返回 IFS 的值

“echo $IFS”不返回 IFS 的值

我已设置IFSx,即IFS=x。现在,如果我检查 的值IFS,那么如果我不使用双引号,它就会显示为空:

~ $ echo $IFS | cat -e
$
~ $ echo "$IFS" | cat -e
x$
~ $ echo $HOME   
/home/mar
~ $ echo "$HOME"
/home/mar
~ $ 

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

答案1

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

因此,例如:

IFS=xxx;
printf %q $IFS
''''''[root@localhost ~]#

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

printf %q "$IFS"
xxx[root@localhost ~]#

答案2

我想这与中所述有关高级 Bash 脚本指南

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

结合例子(5.1):

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

IFS='\'
echo $var        # '(] {}$"     \ converted to space. Why?
echo "$var"      # '(]\{}$"

答案3

解决这里分词问题的另一种方法是:

set | grep -w IFS=

其输出默认 IFS 为

IFS=$' \t\n'

请参阅 Stack Overflow 上的相关帖子:

相关内容