Bash 脚本中的 <<!END 是什么?

Isa*_*aac 29 bash bash-scripting

考虑:

#!/bin/bash

/u01/app/oracle/middleware/oracle_common/common/bin/wlst.sh <<!END
connect('user','pw');
p=redeploy('application');
p.printStatus();
exit();
!END
Run Code Online (Sandbox Code Playgroud)

上面的脚本可以帮助我重新部署 weblogic 应用程序。我不明白的区域wlst.sh <<!END和最后一个!END.

这两个!END语句的作用是什么?

gle*_*man 48

这是一个在此文献-之间的线路<<!END!END被馈送到wlst.sh的标准输入

也可以表示为:

echo "connect('user','pw');
p=redeploy('application');
p.printStatus();
exit();" | /u01/app/oracle/middleware/oracle_common/common/bin/wlst.sh
Run Code Online (Sandbox Code Playgroud)

但没有在子shell中运行命令的潜在影响。

也可以表示为:

echo "connect('user','pw');
p=redeploy('application');
p.printStatus();
exit();" > someFile
/u01/app/oracle/middleware/oracle_common/common/bin/wlst.sh < someFile
rm someFile
Run Code Online (Sandbox Code Playgroud)

  • 只是为了清楚起见,它不必是“!END”——它可以是任何字符串。**&lt;&lt;** 后面的任何字符串都将在第二次遇到 Here Document 时标记它的结尾(我通常只使用 END)。 (26认同)
  • 值得一提的是,虽然通常不会为脚本(非交互式 shell)启用历史扩展,但如果启用`&lt;&lt;!END` 将受到历史扩展的影响。最好使用不使用`!` 的字符串。 (15认同)
  • 我觉得这个关于终止字符串选择的讨论很有趣,因为我认为我从来没有见过除了使用了“EOF”之外的任何东西,除非涉及嵌套或交错的 here-documents。 (6认同)
  • 我将使用诸如`END_USAGE` 或`END_HTML` 之类的东西来为heredoc 提供更多的上下文。 (2认同)