【问题标题】:bash try/catch behaviour bash -ex << EOF ... EOF or Here Documents and variable expansion [duplicate]bash try/catch 行为 bash -ex << EOF ... EOF 或 Here 文档和变量扩展 [重复]
【发布时间】:2017-08-01 07:45:18
【问题描述】:

我不是 bash 专家,无法真正描述我的问题。这就是我向您展示我的脚本的原因:

#!/bin/bash -x
bash -ex << TRY
  VAR1="123"
  echo "$VAR1"
TRY
echo "exit code: $?"

当我运行脚本时,它会产生以下输出:

+ bash -ex
+ VAR1=123
+ echo ''

+ echo 'exit code: 0'
exit code: 0

我的问题:为什么变量 VAR1 没有在 echo 命令中赋值?我希望得到以下输出:

+ bash -ex
+ VAR1=123
+ echo ''
123
+ echo 'exit code: 0'
exit code: 0

【问题讨论】:

  • 这并不是真正的异常处理。它只是一个可以提前中止的单独程序,并且只有在传递给bash 的脚本根本不需要从标准输入中读取时才有效。
  • 这就是我的用例所需要的,感谢您的澄清

标签: bash


【解决方案1】:

这是因为$VAR1 甚至在进入 bash 实例之前就被当前 shell 扩展了。

如果您不希望从外部扩展变量,请如下引用TRY。 (您可以使用单引号或双引号。)

bash -ex << "TRY"
  VAR1="123"
  echo "$VAR1"
TRY

来自Bash manual

3.6.6 这里的文档

这种类型的重定向指示 shell 从 当前源,直到仅包含单词的行(没有尾随 空白)可见。然后使用到该点读取的所有行 作为 a 的标准输入(或文件描述符 n,如果指定了 n) 命令。

here-documents的格式为:

[n]

无参数和变量扩展、命令替换、算术 对 word 执行扩展或文件名扩展。如果任何部分 word 被引用,分隔符是 word 上引号删除的结果, 并且 here-document 中的行没有展开。如果单词是 未引用,此处文档的所有行都受参数 扩展,命令替换和算术扩展, 字符序列 \newline 被忽略,必须使用'\'来引用 字符“\”、“$”和“`”。

如果重定向操作符是'

【讨论】:

    【解决方案2】:

    由于您的Try/Catch 是一个heredoc,shell 会进行变量扩展。
    试试这个:

    #!/bin/bash -x
    bash -ex << \TRY
      VAR1="123"
      echo "$VAR1"
    TRY
    echo "exit code: $?"
    

    这也可以通过引用heredoc 标记来实现。但是,如果要执行变量替换,请不要引用它。

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2020-02-14
      相关资源
      最近更新 更多