ll *_*ool 3 shell bash quoting command-substitution
命令
echo `echo \\\\\\\z`
Run Code Online (Sandbox Code Playgroud)
来自这本书,我不明白为什么它会打印
\\z
Run Code Online (Sandbox Code Playgroud)
当它通过 bash 脚本执行时。
我认为它应该打印
\\\z
Run Code Online (Sandbox Code Playgroud)
反斜杠有效地为您提供了反斜杠的双重处理。(一次是主命令行被处理,另一次是命令替换中的命令。)
就像 Kusalanda 所说的那样,$(..)命令替换是不同的。
首先,让我们注意我们似乎在谈论 Bash 的echo,默认情况下它不处理反斜杠转义本身,因此例如echo '\\'传递\\给echowhich prints \\。如果您使用echo处理反斜杠本身的an (如 Bash with shopt -s xpg_echo、或 Dash 或 zsh),您将得到最后一个\\变成\and\z作为输出。
当使用旧式反引号替换形式时,反斜杠保留其字面含义,除非后跟 [美元符号、反引号或反斜杠]。
所以,在命令中
echo `echo \\\\\\\z` # 7 backslashes
Run Code Online (Sandbox Code Playgroud)
在\\对获得第一缩小到个\s,并且\z保持原样\z(它不跟任何三个,让反斜线是文字)。然后反引号中的命令再次通过 shell。
所以命令替换中的命令最终为
echo \\\\z # 4 backslashes
Run Code Online (Sandbox Code Playgroud)
其中\\成对减少为单个\s,并且参数echo变为\\z(通过两个echos打印不变,请参阅上面的警告)。
您可以使用美元符号看到类似的结果,例如:
var=foo
echo `echo \$var`
Run Code Online (Sandbox Code Playgroud)
打印foo。
echo `echo '\$x'`
Run Code Online (Sandbox Code Playgroud)
打印$x。(单引号不保护$)
$(...)命令替换的形式更合理,它的内容只处理一次,所以:
echo $(echo \\\\\\\z) # 7 backslashes
Run Code Online (Sandbox Code Playgroud)
打印\\\z(3) 和
var=foo
echo $(echo \$var)
Run Code Online (Sandbox Code Playgroud)
打印$var。
另见:
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |