GNU/Linux >> Linux の 問題 >  >> Linux

シェル - 変数の内容をファイルに書き込む

変数が次の場合、上記の答えはどれも機能しません:

  • -e で始まる
  • -n で始まる
  • -E で始まる
  • \ を含む n が続く
  • その後に余分な改行を追加しないでください

そのため、任意の文字列コンテンツを信頼することはできません。

bash では、「ヒア文字列」を次のように使用できます:

cat <<< "$var" > "$destdir"

以下のAshのコメントで述べたように、@ Trebawaの回答(私の部屋と同じ部屋で作成されたものです!) printf を使用 cat よりも優れたアプローチです .


上記のすべてが機能しますが、最初に発生する必要のない問題 (エスケープと特殊文字) も回避する必要があります:変数がシェルによって展開されるときの特殊文字。そもそもそれ(変数展開)をしないでください。変数を展開せずに直接使用してください。

また、変数にシークレットが含まれていて、そのシークレットをファイルにコピーする場合は、シェル コマンドのトレース/コマンド エコーによってシークレットが明らかになる可能性があるため、コマンド ラインで展開したくない場合があります。つまり、$var を使用するすべての回答 変数の内容をシェルのトレースとログに公開することにより、潜在的なセキュリティ リスクが生じる可能性があります。

すでにエクスポートされている変数については、これを使用してください:

printenv var >file

つまり、OP の質問の場合:

printenv var >"$destfile"

注:変数名は大文字と小文字が区別されます。

警告:printenv で出力するためだけに変数をエクスポートするのは得策ではありません。シークレットを含むエクスポートされていないスクリプト変数がある場合、それをエクスポートすると、将来のすべての子プロセスに公開されます (たとえば、export -n を使用してエクスポートしない場合を除く)。 ).


echo を使用 コマンド:

var="text to append";
destdir=/some/directory/path/filename

if [ -f "$destdir" ]
then 
    echo "$var" > "$destdir"
fi

if $destdir をテストします ファイルを表します。

> ファイルを切り捨てた後にテキストを追加します。 $var のテキストのみを追加する場合 ファイルの既存の内容に、>> を使用します 代わりに:

echo "$var" >> "$destdir"

cp コマンドは、テキストをファイルに書き込むためではなく、ファイルを (ファイルに) コピーするために使用されます。


echo var の場合に問題があります -e のようなものが含まれています 、フラグとして解釈されます。別のオプションは printf です 、しかし printf "$var" > "$destdir" は変数内のエスケープ文字を展開するため、変数にバックスラッシュが含まれているとファイルの内容が一致しません。ただし、 printf のため バックスラッシュのみをフォーマット文字列のエスケープとして解釈します。%s を使用できます 正確な変数の内容を宛先ファイルに保存するためのフォーマット指定子:

printf "%s" "$var" > "$destdir"


Linux
  1. シェル変数でWebページのコンテンツを取得するには?

  2. あるファイルの内容を別のファイルで検索する

  3. .sh ファイルがマルウェアになる可能性はありますか?

  1. コマンドの出力をシェル変数に保存しますか?

  2. サブシェルで変数が表示されるのはなぜですか?

  3. ファイル記述子とシェルスクリプト?

  1. 別のファイルに書き込む方法は?

  2. すべてのTmuxスクロールバックをファイルに書き込みますか?

  3. 変更中にファイルの内容を出力しますか?