![解释命令 `printf -- "#!${opt_E}"`](https://linux22.com/image/28055/%E8%A7%A3%E9%87%8A%E5%91%BD%E4%BB%A4%20%60printf%20--%20%22%23!%24%7Bopt_E%7D%22%60.png)
我无法理解这个命令并且感到困惑:以下是我在 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
答案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 将在执行时打印每一行的跟踪信息。