ここのドキュメントを使用して、Bashスクリプトからスクリプトを生成します。私の変数が置き換えられるのはなぜですか?

ここのドキュメントを使用して、Bashスクリプトからスクリプトを生成します。私の変数が置き換えられるのはなぜですか?

基本スクリプトからスクリプトを生成する際に問題があります。

とても簡単です:

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_

関連情報