Bash 分词机制

dra*_*ang 3 string bash shell

我是 Bash 新手,我发现 Bash 会自动进行分词:

a="1  2     3 4"
Run Code Online (Sandbox Code Playgroud)

如果我用echo $a我得到的回显“a” 1 2 3 4,它就隐式地进行了分词。如果我循环“a”,我分别得到 1、2、3 和 4。

我还从这里读到

shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。

我还发现如果我有

b=$a;
echo "$b"
Run Code Online (Sandbox Code Playgroud)

我会得到

"1 2 3 4"
Run Code Online (Sandbox Code Playgroud)

所以,这是我的问题:分词什么时候完成?它会改变字符串本身吗?是不是只有使用echoor for(循环)才生效?

更一般地说,bash 如何处理它?

che*_*ner 7

实际上有好几轮分词。第一个是在解析命令行之前执行的,因此echo $a分为两个单词echo$a。(这就是为什么类似的东西a="echo foo | wc -l"; $a不执行管道;解析在$a扩展之前完成)。该轮分词结束后,进行参数扩展,产生 2 个字符串,echo并且1 2 3 4。然后,参数扩展产生的字符串本身会进行分词,因为它没有被引用,从而产生 4 个额外的单词1, 2, 3, 和4

在 for 循环中,列表中的项目会进行分词:

for b in $a; do
Run Code Online (Sandbox Code Playgroud)

被扩展(在分词产生for, b, in, $a, ;, 和后do)为for, b, in, 1 2 3 4, ;, 和do。参数扩展产生的字符串再次被分词为1234