使用反引号时,Bash会抱怨here-document中的语法错误

时间:2018-02-12 11:39:20

标签: bash cat quoting backticks

我正在运行以下一段bash代码:

cat << END_TEXT
       _             _ 
      | |           | |
  __ _| |__   ___ __| |
 / _` | '_ \ / __/ _` |
| (_| | |_) | (_| (_| |
 \__,_|_.__/ \___\__,_|
END_TEXT

并且收到错误:

bash: command substitution: line 1: syntax error near unexpected token `|'
bash: command substitution: line 1: ` | '_ \ / __/ _'

2 个答案:

答案 0 :(得分:8)

无需逃避反击。只需使用引用的here-doc字符串:

cat <<-'END_TEXT'
        _             _
       | |           | |
   __ _| |__   ___ __| |
  / _` | '_ \ / __/ _` |
 | (_| | |_) | (_| (_| |
  \__,_|_.__/ \___\__,_|
END_TEXT

根据man bash

  

如果word 未加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展,忽略字符序列\<newline>,{{1必须用于引用字符\\$

答案 1 :(得分:0)

这是反击。 here-document中的大多数内容都不是按字母顺序排列并按原样使用,但反引号会更改此内容。

解决方案:逃避它们,即使它弄乱了你的脚本布局:

cat << END_TEXT
       _             _ 
      | |           | |
  __ _| |__   ___ __| |
 / _\` | '_ \ / __/ _\` |
| (_| | |_) | (_| (_| |
 \__,_|_.__/ \___\__,_|
END_TEXT