web-dev-qa-db-ja.com

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

このスクリプトでは、 "$ 1"が/ testファイルに保存されることになります。

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

真実は..私は保つ必要があります

'EOF'

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

$ 1ではなく、その引数を保存する必要があります

9
user72685

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

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

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

両方のcatsを同じファイルに入れるには、2番目(およびそれ以降)のリダイレクトに>>redirection を使用しています。これは、ファイルに追加することを意味します。 1つ目は、単一の>を使用してファイルをクリアし、新しく開始します。

変数が置換された場合でも 、その変数の値に追加のドル記号がある場合はありません自分自身を再置換:

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

出力されます:

$bar

$barの値を代入せずに。

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

oo.sh "$(cat myfile)"

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

15
Michael Homer

1つの変数をファイルに出力したいだけのように聞こえます。その場合、これはうまくいきます:

echo $1 >/test

ご了承ください /testはルートディレクトリにあり、通常のユーザーには通常、書き込み権限がありません。

編集:ドル記号を含む文字列コマンドラインでを引用する必要があることを覚えておいてください。これが置換が発生する場所であり、スクリプトは事後はそれについて何もできません。

1
Tom Zych