셸 변수에 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

1
expr을 사용하지 않고도 수학을 할 수 있습니다. 이중 괄호 사용 : $ ((7 + 2))
Barry Brown

사실은 내가 지금부터 내 모든 답변을 것을 시도 할 수 있습니다 - APPEND :-) 떼의 교육에 대한 (항상 완전히) 관련 조각
paxdiablo

좋은 지적입니다, 배리,하지만 그것은 단지 중첩의 예일뿐입니다. 제 예를 생성하는 기술은 나이 (및 / 또는 알코올 :-)로 인해 악화 된 것으로 보입니다.
paxdiablo

방금 $ (())에 대해 알게되었습니다.
Barry Brown

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

줄 바꿈은 공백이므로 "제거"됩니다.


2

다른 답변을 하나의 라이너로 결합 :

echo "($(grep apache README))"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.