我在 Ubuntu 20.04 上使用 Bash 5.0.17
这是对这个问题的跟进。在问这个问题之前,我以为我了解它是如何IFS
工作的,但现在我完全糊涂了,我有一连串的问题:
- 静态字符串是什么意思?
- 分词和扩展有什么区别?
- 我在这个网站的某个地方读到推荐引用变量(*),但有时我会得到不同的结果,例如:
IFS=":"; for i in 1:2:3; do echo $i; done # output: 1 2 3
IFS=":"; for i in 1:2:3; do echo "$i"; done # output: 1:2:3
# Why do the quotes make a difference between the two commands?
请,如果您认为这些是愚蠢的问题,请忽略它。如果有人有兴趣帮助我消除这种困惑,我将非常感谢他/她的帮助
谢谢
编辑:在下面添加链接
(*):我指的是这两个答案:
您的
for
-loop 的行为不像您认为的那样:$i
将是字面意思1:2:3
,所以你的循环只运行一次。IFS
仅通过变量扩展或使用read
命令使用特殊变量拆分单词。这也是您问题的答案。
当您运行
IFS=:; i=1:2:3; echo $i;
时,扩展(和单词拆分)仅发生在最后一个命令中,并且“单词”(1、2 和 3)分别回显 -->1 2 3
。(就像@ikkachu 在他的回答中已经说过的那样,这就是echo
行为方式)。加上引号
$i
将防止分词,并将echo
按字面意思输出变量 (1:2:3
)。您还可以使用这些知识
for
通过使用变量扩展来修复循环:将输出:
我想我已经找到了我的问题的答案(对于最后两个问题,感谢这个网页)。
1.什么是静态字符串?
这不是准确的措辞。但我认为这意味着一个“文字”字符串。
2、扩容和分词有什么区别?
扩展是指:大括号扩展、波浪号扩展、Shell 参数和变量扩展(这涉及使用
$
符号)、命令替换、算术扩展、进程替换、分词和文件名扩展。所以分词是扩展的特例,引用上面的网页:
但要记住的重要一点是:
?️如果没有发生扩展,则不执行拆分。?️
3.第三题由第2题回答。