解释命令 `printf -- "#!${opt_E}"`

解释命令 `printf -- "#!${opt_E}"`

我无法理解这个命令并且感到困惑:以下是我在 Linux 上执行的尝试了解其工作原理的内容

[root@testgfs2 final_scripts]# printf -- "#!${opt_E}"
printf -- "#reset{opt_E}"
#reset{opt_E}[root@testgfs2 final_scripts]# printf -- "#!${opt_E}"
printf -- "#"#reset{opt_E}"{opt_E}"
##reset{opt_E}{opt_E}[root@testgfs2 final_scripts]# echo !$
echo "#"#reset{opt_E}"{opt_E}"
##reset{opt_E}{opt_E}

这是如何工作的,我不知道它出现在什么主题下,所以我也无法在谷歌上找到它。

--printf 之后做什么

答案1

Bash 参考手册:

!!:$

指定前面命令的最后一个参数。这可以缩写为 !$。

如果这种行为是不受欢迎的,您可以逃跑!带反斜杠:

% echo "\!$"                  
!$

答案2

在脚本中,角色#!在这种情况下并不特殊。该代码片段使用两个参数printf -- "#!${opt_E}"调用printf命令:--,并#!与变量的值连接opt_E。该参数--表明printf,即使后续有以 开头的参数-,它们也不会被解释为选项;它在这里没有什么区别,因为#!${opt_E}不以 开头-。双引号可以#!${opt_E}防止#被解释为注释起始字符,并且可以防止 的值opt_E被拆分为被解释为通配符模式的单独单词。

如果 的值opt_E不包含任何%\字符,则此命令将打印#!后跟 的值opt_E,最后没有换行符。一般来说,该命令将 的值解释opt_E为 printf 格式。

如果您在交互式 shell 中尝试此操作,您可能会看到奇怪的效果,因为它!被解释为历史扩展字符,它会自动调用以前的命令。为了避免这种情况,请在\之前添加!.!也在单引号内按字面解释:printf -- '#!${opt_E}'.

如果您要重播脚本,则必须先设置opt_E正确的值。如果您尝试调试脚本,请添加set -x第二行(将其插入到第一#!行的正下方):shell 将在执行时打印每一行的跟踪信息。

相关内容