あなたの前の質問に続いて、いくつかの未解釈のテキストといくつかの解釈されたテキストの両方をファイルに入れたいようです。その場合は、2つの異なるcat
s(またはecho
s)を使用します。
cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF
ここでは、いくつかのことが行われています。最初に、ヒアドキュメントの構文<<
。上記の最初のように、ターミネータ文字列に引用符を含めると、ヒアドキュメント全体が解釈されず、パラメータも置換もありません。上記の2番目のように引用符を使用しない場合、などの変数はその値に置き換えられ、コマンド置換がテキストに含まれます。置換が必要かどうかに基づいて、「EOF」文字列を引用するかどうかを選択します。 cat
$1
両方置くために、cat
私たちが使用している同じファイルにSを>>
リダイレクトを手段がファイルに追加すること:二(およびそれ以降)リダイレクションのために。1つ目は、シングルを使用し>
てファイルをクリアし、最初からやり直します。
場合でも、そのノートの変数が置換されている、その変数の値に追加のドル記号がされていない再置換自身:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
出力されます:
$bar
$bar
の値を代入せずに。
ただし、このスクリプト全体の引数に「$」を指定する場合は、コマンドラインでエスケープするか、全体を一重引用符で囲む必要があります。または、他の質問のようにコマンド置換を使用すると、ファイル全体の内容を直接入力できます。ファイルの内容にドル記号を含めます。そこで必ず置換文字列を引用してください:
oo.sh "$(cat myfile)"
myfile
as のボディを取得し、必要に応じてor する$1
ことができます。私の回答と同じ制限が適用されます。コマンドライン引数の長さに制限があり、ファイルがそれより長くなる可能性がある場合は、別の方法を見つける必要があります。あなたはあなたのシステムの限界が何であるかを知ることができますcat
echo
getconf ARG_MAX
$1
)にドル記号が含まれているためです。」最初のコマンドラインパラメータを参照する場合は除きます。 スクリプトが実行される前に、置換が行われました。 コマンドラインでエスケープする必要があります。