我是 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 如何处理它?
实际上有好几轮分词。第一个是在解析命令行之前执行的,因此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。参数扩展产生的字符串再次被分词为1、2、3和4。
| 归档时间: |
|
| 查看次数: |
4419 次 |
| 最近记录: |