grepの結果をシェル変数に割り当てた後に改行が失われる


80
#!/usr/local/bin/bash
out=`grep apache README`
echo $out;

通常、grepは、コマンドラインで実行すると、各一致を別々の行に表示します。ただし、上記のスクリプトでは、各一致を区切る改行は表示されません。改行を保存する方法を知っている人はいますか?

shell 


回答:


105

あなたは割り当てではなくエコーでそれを失っています。次の場合、これをはっきりと見ることができます。

echo "${out}"

次のスクリプトでも同様の効果が見られます。

x="Hello,
I
am
a
string
with
newlines"
echo "====="
echo ${x}
echo "====="
echo "${x}"
echo "====="

出力:

=====
Hello, I am a string with newlines
=====
Hello,
I
am
a
string
with
newlines
=====

そして、あなたの質問とは無関係ですが、とにかく言及したいのですが、コマンドをネストできるという追加の利点のために、バックティックではなく$()構造を使用することを好みます。したがって、スクリプト行は次のようになります。

out=$(grep apache README)

今では違いはないかもしれませんが(そうではありません)、次のようなより複雑なコマンドが可能になります。

lines_with_nine=$(grep $(expr 7 + 2) inputfile)

2
$()でそれができるとは知りませんでした...ここでいつも新しいことを学びましょう。
Tanj 2009

1
exprを使用せずに数学を行うことができます。ダブルパレンを使用するだけです:$((7 + 2))
バリーブラウン

実際、私はこれからすべての答えでそれを試すかもしれません-群れの教育に(必ずしも完全ではない)関連するスニペットを追加してください:-)
paxdiablo 2009

良い点です、バリー、しかしそれは入れ子のほんの一例でした-私の例を生み出すスキルは年齢(および/またはアルコール:-)とともに低下したようです。
paxdiablo 2009

私自身、$(())のことを知りました。
バリーブラウン

34

$ outを引用符で囲みます:

#!/usr/local/bin/bash
out=`grep apache README`
echo "$out";

20

bashで変数を引用すると、空白が保持されます。

例えば:

#!/bin/bash
var1="A B  C   D"
echo $var1   # A B C D
echo "$var1" # A B  C   D

改行は空白であるため、「削除」されます


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.