【问题标题】:Problem with heredoc inside case. Bash script [duplicate]外壳内的heredoc有问题。 Bash脚本[重复]
【发布时间】:2020-08-02 02:38:47
【问题描述】:

如果我在我的终端上写

cat <<-EOF
hello
EOF

我得到了预期的输出,你好。

现在,在我正在编写的脚本中,我有

PARAMS=""
while (( "$#" )); do
  case "$1" in
    -h|--help)
      cat <<-EOF
      hello
      EOF
      exit 0  
      ;;
    --) # end argument parsing
      shift
      ...

但是 vscode 会突出显示 cat&lt;&lt;-EOF 行之后的所有内容,就好像它们都是一个字符串一样,基本上忽略了 EOF。 事实上,当我运行脚本时,我得到了一个

syntax error: unexpected end of file

错误

编辑:

如果我像这样缩进代码:

while (( "$#" )); do
  case "$1" in
    -h|--help)
      cat <<EOF
      ciao
EOF
      exit 0  
      ;;
    --) # end argument parsing
      shift
      ...

左侧有 EOF,vscode 可以正常识别它,将文件的其余部分高亮显示为普通的 bash 脚本,一切正常。但是在缩进方面这很糟糕。有没有办法用 cat 命令缩进 EOF?

【问题讨论】:

  • 你能试着在 EOF 前面加一个tab 吗?
  • @Philippe 是什么?
  • 很确定 EOF 必须开始该行。
  • 在 EOF 前面的选项卡仍然存在问题。它仅在 EOF 像@stark 所说的那样位于行首时才有效。
  • 确保你已经放了一个tab,来自文档If the redirection operator is &lt;&lt;-, then all leading tab characters are stripped from in- put lines and the line containing delimiter. This allows here-documents within shell scripts to be indented in a natural fashion. 我刚刚测试了你的代码,它适用于tab

标签: bash shell heredoc


【解决方案1】:

您可以在 here-doc 中的 EOF 之前使用空格,如下所示:

    cat <<"    EOF"
        foo
        bar
    EOF

但为了避免格式/缩进问题,我更喜欢为此使用函数:

print_help() {
cat <<EOF
    foo
    bar
EOF
}
...
PARAMS=""
while (( "$#" )); do
  case "$1" in
    -h|--help)
      print_help
      exit 0  
      ;;
    --) # end argument parsing
      shift
      ...

它还使代码更简洁。

【讨论】:

    【解决方案2】:

    -EOF 必须位于行首。当我漂亮地打印一个脚本并无意中缩进heredoc终止符时,我已经多次犯过这个错误。

    【讨论】:

    • 无法创建新答案,所以我要添加此评论。这不是这里的问题...他使用了&lt;&lt;-EOF,其中破折号表示您可以缩进heredoc终止符...实际的问题是您必须在缩进终止符时使用TABS(正如你所看到的here 和@Philippe 所说的那样)并且可能@ninazzo 使用了空格。另一件事是终止符后面不能跟 any 字符,否则会中断
    • 注意:原始问题陈述的EOF前面有一个-。稍后在问题陈述中, - 被省略。答案仍然是终止符必须出现在行的开头(并且后面没有其他内容)。不分青红皂白地打印 bash 脚本并不是一种普遍的安全做法。
    猜你喜欢
    • 2021-09-11
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多