「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

$文書の一部または特定の特殊文字(はい、いいえ)に対してのみ拡張を有効にしたいようです\。最初のケースではこの文書を2つの部分に分けたい場合があり、2番目のケースでは非標準的なアプローチを提案します。これを\変数として扱います。

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

答え3

1つのオプションは、文字列を生成してから単に変数を置き換えることです。私はこれが手動変数拡張であることを知っていますが、解決策です。

# 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

関連情報