Bash单词分裂机制

时间:2013-08-28 21:08:12

标签: string bash shell

我是Bash的新手,我看到Bash完成了自动分词:

a="1  2     3 4"

如果我通过echo $a回应“a”,我得到了1 2 3 4,它隐含地进行了单词分割。如果我循环“a”,我分别得到1,2,3和4。

我还从here读到了

  

shell扫描参数扩展命令的结果   替换和未发生的算术扩展   用于分词的双引号。

我还发现如果我有

b=$a;
echo "$b"

我会得到

"1 2 3 4"

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

更一般地说,bash如何处理它?<​​/ p>

3 个答案:

答案 0 :(得分:1)

阅读man bash。对于作业,它说

  

所有值都进行波形扩展,参数和变量扩展,命令替换,算术扩展和引用删除[...]不执行单词拆分,但“$ @”除外,如下面特殊参数中所述。不执行路径名扩展。

[[ ]]条件下也不会发生分词:

  

不对[[和]]

之间的单词执行单词拆分和路径名扩展

答案 1 :(得分:1)

实际上有几轮分词。第一个是在解析命令行之前执行的,因此echo $a被分为两个单词echo$a。 (这就是像a="echo foo | wc -l"; $a这样的东西不执行管道的原因;解析在$a扩展之前完成了。在那一轮分词结束后,参数展开会产生2个字符串,echo1 2 3 4。然后,参数展开产生的字符串会自行进行分词,因为它没有引用,产生了4个额外的单词1234

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

for b in $a; do

被展开(在分词后产生forbin$a;do)到{ {1}},forbin1 2 3 4;。同样,参数扩展产生的字符串会经过分词到do123

答案 2 :(得分:1)

Bash作为下一个 - 解析脚本或命令行时:

  1. 解析和词法分析
  2. 扩张
    1. 支撑扩张
    2. tidle expansion
    3. 变量扩展
    4. 算术和其他替代
    5. 命令替换
    6. 分词
    7. 文件名生成(globbing)
  3. 删除引号
  4. 正如你所看到的,单词分裂几乎已经结束,所以在例如算术扩展但在文件名为globbing之前,删除引号是最后一步。