![“echo $IFS”不返回 IFS 的值](https://linux22.com/image/67052/%E2%80%9Cecho%20%24IFS%E2%80%9D%E4%B8%8D%E8%BF%94%E5%9B%9E%20IFS%20%E7%9A%84%E5%80%BC.png)
我已设置IFS
为x
,即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 上的相关帖子: