这是一个 shell 命令:
set hello "hello" "hello world"
因为是shell命令,所以shell执行报价删除作为执行命令之前的最后一步。
将其与文件中的文本进行对比:
$ cat file
hello "hello" "hello world"
当 shell 读取此文件时,它将引号视为另一个字符。该文件中的引号永远不会直接出现在命令行上,因此它们不受报价删除.
文档
从以下部分中man bash
讨论扩展:
报价删除
在前面的扩展之后,所有未加引号的字符 \、' 和 " 不是由上述之一产生的
扩展被删除。
分词和引用删除如何相互作用
Bash 确实分词在引用删除之前。这很重要,例如对于以下命令:
set hello "hello" "hello world"
当 shell 进行分词时,它会找到三个参数set
命令。它只是作为执行前的最后一步set
shell 确实删除了引号。由于没有进行进一步的分词,因此参数的数量set
仍为三。
让我们将上面的结果与从文件中读取一行的结果进行对比:
$ cat file
hello "hello" "hello world"
$ read line <file
$ echo "$line"
hello "hello" "hello world"
如上所述,shell 不会删除内容的引号line
。现在,让我们使用$line
作为论点set
:
$ set $line
$ echo $#
4
找到四个参数。这些论点是:
$ echo 1=$1 2=$2 3=$3 4=$4
1=hello 2="hello" 3="hello 4=world"
正如您所看到的,文件中的引号被视为普通的普通字符,就像,h
or e
。最后,"hello world"
文件中的内容被扩展为两个单词,每个单词都有一个引号字符。