我是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"
所以,这是我的问题:什么时候分词完成?它会改变字符串本身吗?它只在我使用echo
或for
(循环)时生效吗?
更一般地说,bash如何处理它?</ p>
答案 0 :(得分:1)
阅读man bash
。对于作业,它说
所有值都进行波形扩展,参数和变量扩展,命令替换,算术扩展和引用删除[...]不执行单词拆分,但“$ @”除外,如下面特殊参数中所述。不执行路径名扩展。
在[[ ]]
条件下也不会发生分词:
不对[[和]]
之间的单词执行单词拆分和路径名扩展
答案 1 :(得分:1)
实际上有几轮分词。第一个是在解析命令行之前执行的,因此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
被展开(在分词后产生for
,b
,in
,$a
,;
和do
)到{ {1}},for
,b
,in
,1 2 3 4
和;
。同样,参数扩展产生的字符串会经过分词到do
,1
,2
和3
。
答案 2 :(得分:1)
Bash作为下一个 - 解析脚本或命令行时:
正如你所看到的,单词分裂几乎已经结束,所以在例如算术扩展但在文件名为globbing之前,删除引号是最后一步。