![变量未用“EOF”解释](https://linux22.com/image/9687/%E5%8F%98%E9%87%8F%E6%9C%AA%E7%94%A8%E2%80%9CEOF%E2%80%9D%E8%A7%A3%E9%87%8A.png)
这是我的脚本:
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