基本スクリプトからスクリプトを生成する際に問題があります。
とても簡単です:
cat pippo << EOF
LOGFILE=test.log
echo '#############################' >> $LOGFILE
EOF
。しかし、pippoをチェックすると、次のような結果が表示されます。
LOGFILE=test.log
echo '#############################' >>
EOF
$LOGFILEが置き換えられたのはなぜですか?
答え1
デフォルトでは、ここにあるドキュメントはシェル拡張、正確な引数拡張、コマンド置換、算術拡張の影響を受けます。したがって、あなたの場合、変数(引数)拡張が発生します。変数はLOGFILE
現在シェルで拡張されており、変数が存在しない可能性があるため、nullは拡張値として返されます(および置き換えられます)。
ここで説明されているように、文字通りシェルメタ文字を取得するには、終端文字列の周囲に引用符を使用します。
cat pippo <<'EOF' ## "EOF" would do too
LOGFILE=test.log
echo '#############################' >>"$LOGFILE"
EOF
また、変数拡張を引用してください。 (おそらく)ファイル名を参照しているため、拡張後はトークン化されず、パス名は拡張されません。
答え2
実際にpippo
ファイルを所有するには、次のことが必要です。
cat > pippo <<EOF
ここでドキュメントの値をpippo
。
その後、この文書の内容を拡張、評価、または変更せずに作成されたとおりに正確に送信するには、次のいずれかを引用する必要があります(部分引用も可能)<<
。
<<'EOF'
<<"EOF"
<<\EOF
<<E"O"F
<<E\OF
参照がない場合、変数の値は"$LOGFILE"
その値(ユーザー環境ではnullとマークされています)に拡張され、失われます。
簡単に言えば、次のように使用します。
cat > pippo << \_EOF_
LOGFILE=test.log
echo '#############################' >> $LOGFILE
_EOF_