变量未用“EOF”解释

变量未用“EOF”解释

这是我的脚本:

var="lalallalal"
tee file.tex <<'EOF'
text \\ text \\
$var
EOF

需要使用“EOF”(带引号),因为否则我不能使用双斜杠(//)。

但是,如果我使用引号,则该$var变量不会扩展。

答案1

正如您发现的那样,如果您引用EOF,变量将不会扩展。这记录在以下文档的此处文档部分man bash

   No parameter and variable expansion, command  substitution,  arithmetic
   expansion,  or pathname expansion is performed on word.  If any part of
   word is quoted, the delimiter is the result of quote removal  on  word,
   and  the  lines  in  the  here-document  are  not expanded.  If word is
   unquoted, all lines of the here-document  are  subjected  to  parameter
   expansion,  command substitution, and arithmetic expansion, the charac‐
   ter sequence \<newline> is ignored, and \ must be  used  to  quote  the
   characters \, $, and `.

那里解释的另一件事是你仍然可以使用\,你只需要转义它:\\。所以,既然你想要两个\,你需要转义它们中的每一个:\\\\。将所有这些放在一起:

#!/bin/bash
var="lalallalal"
tee file.tex <<EOF
text \\\\ text \\\\
$var
EOF

答案2

看来您只想仅对文档的一部分或仅对某些特殊字符启用扩展($是,\否)。在第一种情况下,您可能想将此处文档分为两部分,在第二种情况下,让我提出非标准方法:将其\视为变量:

var="lalallalal"
bs='\';                       #backslash
tee file.tex <<EOF
text $bs$bs text $bs$bs
$var
EOF

答案3

一种选择是在创建字符串后简单地替换变量。我知道这是一种手动变量扩展,但它是一个解决方案。

# Set variables
var="lalallalal"
read -rd '' tex_data <<'EOF'
text \\ text \\
${var}
EOF

# Expand variable
tex_data="${tex_data//\$\{var\}/$var}"
printf "%s" "$tex_data" | tee file.tex

相关内容