変数が次の場合、上記の答えはどれも機能しません:
-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"