'EOF' を使用し、変数をリテラルと見なす bash スクリプトに変数を渡す

'EOF' を使用し、変数をリテラルと見なす bash スクリプトに変数を渡す

このスクリプトでは、最終的に「$1」が /test ファイルに保存されます。

#!/bin/bash
cat > /test << 'EOF'
$1
EOF

真実は…私は

'EOF'

引数($1)にドル記号が含まれているため、「EOF」として扱われます。

しかし、私はその議論を1ドルではなく保存する必要がある

答え1

あなたのフォローアップ前の質問、あなたは望んでいるようです両方解釈されないテキストと解釈されるテキストがファイルに入力されます。その場合は、2 つの異なるcat(またはecho)を使用します。

cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF

ここではいくつかのことが起こっています。まず、ヒアドキュメント構文を で囲みます<<。最初の例のように、ターミネータ文字列に引用符を含めると、ヒアドキュメント全体が解釈されず、パラメータも置換も行われません。しない引用符は使用しないでください。2番 cat上記のように、変数は$1値に置き換えられ、コマンド置換がテキストに含まれます。置換が必要かどうかに基づいて、「EOF」文字列を引用符で囲むかどうかを選択します。

両方のcatsを同じファイルに入れるには、>> リダイレクション>2 回目 (およびそれ以降) のリダイレクトの場合: ファイルに追加することを意味します。最初のリダイレクトでは、ファイルをクリアして最初からやり直すためにsingle を使用します。

ただし、変数が代入される、その変数の値に追加のドル記号ない自分自身を再置換しました:

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF

出力は次のようになります:

$bar

の値を代入せずに$bar

ただし、このスクリプト全体の引数に「$」を指定する場合は、コマンドラインでエスケープするか、全体を一重引用符で囲む必要があります。または、コマンド置換例えばあなたの他の質問ファイルの内容全体、つまりファイルの内容に含まれるドル記号も直接入力できます。置換文字列を引用符で囲むようにしてください。

oo.sh "$(cat myfile)"

myfileの本体を取得し$1、必要に応じてcatそれを実行できますecho私の答えは適用: コマンドライン引数の長さには制限があり、ファイルがそれよりも長くなる可能性がある場合は、別の方法を見つける必要があります。システムの制限を確認するには、getconf ARG_MAX

答え2

単に 1 つの変数をファイルに出力したいだけのようですね。その場合は、次のようにします。

echo $1 >/test

/testルート ディレクトリにあり、通常、一般ユーザーには書き込み権限がないことに注意してください。

編集:ドル記号を含む文字列を引用符で囲む必要があることに注意してくださいコマンドラインでここで置換が行われ、スクリプトは事後的に何も行うことができません。

関連情報