web-dev-qa-db-ja.com

コマンドの出力を変数にキャプチャするときに改行文字(\ n)を保持する方法

簡単な例として、たくさんのソースコードファイルがあります。 「head」コマンドの出力をこれらすべてのファイルの変数に保存したい。

私は試した:

output=$(head $file)

しかし、これは、出力を変数に格納するときに、すべての\n文字が自動的にトリミングされることで起こりました。

\n文字を削除せずに、コマンド出力をそのまま保存するにはどうすればよいですか?

9
return 0

最後の改行が削除されるのは、「コマンド拡張」$(...)または`...`の既知の欠陥です。

それがあなたの場合:

$ output="$(head -- "$file"; echo x)"     ### capture the text with an x added.
$ output="${output%?}"                    ### remove the last character (the x).

出力の値を修正します。

7
user79743

output=$(head $file)embedded改行をoutputの値に保持し、all末尾の改行を削除します。

違いを生むのは、変数を参照する方法です。

変数参照を二重引用符で囲みます。次に例を示します。

_echo "$output"
_

埋め込まれた改行を出力しますが、notコマンド展開$(...)によって削除された末尾の改行です。

これは、シェルがドル記号、コマンド展開(逆引用符と$(...))、および二重引用符内のバックスラッシュのみを解釈するため機能します。シェルは、二重引用符の内側にある場合、空白(改行を含む)をフィールド区切り文字として解釈しません。

7
RobertL

終了ステータスも保持するには:

output=$(head < "$file"; r=$?; echo /; exit "$r")
exit_status=$?
output=${output%/}

/は、一部の文字のエンコーディングがxのエンコーディングで終了する一部のロケールで使用される一部の文字セットがあるため、xよりも安全です(/は、他の文字には含まれていません。たとえば、パスの検索が問題になるためです)。

1