131

変数(ここでは)の内容をファイルにコピーしたいと思いvarます。

ファイルの名前は別の変数に格納されますdestfile

これを行うのに問題があります。これが私が試したことです:

cp $var $destfile

ddコマンドでも同じことを試しました...明らかに、シェル$varはディレクトリを参照していると考えていたため、ディレクトリが見つからないと言われました。

これを回避するにはどうすればよいですか?

4

6 に答える 6

180

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

于 2012-07-23T19:12:24.137 に答える
64

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

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

于 2018-03-21T23:56:18.467 に答える
43

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

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

したがって、任意の文字列の内容を信頼することはできません。

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

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

以下のAshのコメントに記載されているように、@ Trebawaの回答(私のものと同じ部屋で作成されました!)を使用printfする方が、よりも優れたアプローチですcat

于 2018-03-21T23:40:59.183 に答える
12

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

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

すでにエクスポートされている変数の場合は、次を使用します。

printenv var >file

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

printenv var >"$destfile"

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

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

于 2020-05-01T15:43:38.723 に答える
8

$var私があなたの言うことを正しく理解していれば、あなたはファイルにコピーしたいと思うでしょう(それが文字列の場合)。

echo $var > $destdir
于 2012-07-23T19:20:36.810 に答える
0

「変数の内容をコピーする」と言うとき、その変数にはファイル名が含まれていますか、それともファイルの名前が含まれていますか?

私はあなたがファイルにコピーしたい内容$varを含むあなたの質問によって仮定しています:

$ echo "$var" > "$destdir"

これにより、$varの値が$destdirというファイルにエコーされます。引用符に注意してください。「$var」を引用符で囲むことが非常に重要です。名前にスペースが含まれている場合は、「$destdir」の場合も同様です。追加するには:

$ echo "$var" >> "$destdir"
于 2012-07-23T19:28:13.903 に答える