[英]How does bash parse double quotes and single quotes
我必须为我的学校作业实现一个用 C 编写的 minishell,我目前正在解析用户输入,我有一个关于单引号和双引号的问题。
它们是如何解析的,我的意思是只要有两个以上的单引号/双引号,就可以有很多组合。 假设我有:“你好”。
如果我回显这个 bash output 将是你好,这是因为 bash 在“”中解释了“你好”,还是因为 bash 将其解释为:“”然后你好“”。 bash 如何解析多个链式引号:" "Hello" ":假设 a = Hello. bash 看到的是“a”还是 bash 看到的是“a”
Bash 对单引号和双引号的解析略有不同。 单引号比较简单,所以我会先介绍它们。
单引号字符串(或字符串的单引号部分——我会讲到)从一个单引号到下一个单引号。 单引号以外的任何内容(包括双引号、反斜杠、换行符等)都只是字符串中的文字字符。 但是下一个单引号结束了单引号部分。 没有办法将单引号放在单引号字符串中,因为下一个单引号将结束单引号部分。
您可以在单个“单词”(或字符串,或任何您想要的名称)中包含不同引号的部分。 因此,例如, ''hello''
将被解析为零长度单引号部分、未引号部分hello
,然后是另一个零长度单引号部分。 由于它们之间没有空格,因此它们都被视为同一个单词的一部分(并且由于单引号部分的长度为零,因此它们对生成的单词/字符串完全没有影响)。
双引号略有不同,其中的某些字符保留其特殊含义。 例如, $
可以引入变量或命令替换等(尽管结果不会像没有双引号那样受到分词的影响)。 反斜杠 function 作为双引号内的转义符,因此\$
将被视为文字美元符号,而不是变量扩展或其他任何内容的开始。 其他可以通过反斜杠转义删除其特殊含义的字符是反斜杠本身,以及......双引号。 您可以在 escaping 它的双引号中包含一个双引号。 双引号部分结束于下一个非转义双引号。
所以比较:
echo ""hello"" # just prints hello
echo "\"hello\"" # prints "hello", because the escaped
# quotes are part of the string
echo "$PATH" # prints the value of the PATH variable
echo "\$PATH" # prints $PATH
echo ""'$PATH'"" # prints $PATH, because it's in
# single-quotes (with zero-lenght
# double-quoted sections on each side
此外,单引号和双引号在其他类型的引号中没有特殊含义。 所以:
echo "'hello'" # prints 'hello', because the single-quotes
# are just ordinary characters in a
# double-quoted string
echo '"hello"' # similarly, prints "hello"
echo "'$PATH'" # prints the PATH variable with
# single-quotes around it (because
# $variable expands in double-quotes)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.