명령 출력을 변수에 저장할 때 줄 바꿈을 유지하는 방법은 무엇입니까?


107

Linux에서 bash 셸을 사용하고 있습니다. 이 간단한 스크립트가 있습니다.

#!/bin/bash

TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP

하지만이 스크립트를 실행하면

./temp.sh

모든 출력은 캐리지 리턴 / 새 줄없이 인쇄됩니다. 출력을 $ TEMP에 저장하는 방식인지 에코 명령 자체인지 확실하지 않습니다.

명령의 출력을 변수에 저장하고 줄 바꿈 / 캐리지 리턴을 유지하려면 어떻게해야합니까?


3
변수에 잘 보존됩니다 (마지막 항목 제외). 당신의 메아리가 깨졌습니다. mywiki.wooledge.org/BashPitfalls 항목 # 14 참조
Charles Duffy

1
또한, don't저장 commands에서 variables. 대신Usefunction
한 솔로

답변:


208

변수를 인용 하십시오. 그 이유는 다음과 같습니다.

$ f="fafafda
> adffd
> adfadf
> adfafd
> afd"

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

따옴표가 없으면 쉘은 $TEMP포함 된 문자로 대체 됩니다 (그 중 하나는 개행 문자 임). 그런 다음 echo쉘 을 호출하기 전에 Internal Field Separator(IFS)를 사용하여 해당 문자열을 여러 인수로 분할 하고 결과 인수 목록을 echo. 기본적으로는 IFS공백 (공백, 탭 및 줄 바꿈)으로 설정되어 있으므로 셸은 $TEMP문자열을 인수로 자르고 새 줄을 볼 수 없습니다. 셸은이를 공백처럼 구분자로 간주하기 때문입니다.


xdotool type "$myVar"작동하지 않습니다. 여전히 새로운 라인없이 변수의 내용을 입력하는 것
azerafati

다음과 같은 작업을 수행하려면 어떻게해야합니까 FOO="$(echo $VAR)"? $VAR이미 따옴표 안에있을 때 어떻게 올바르게 인용합니까?
weberc2

@ weberc2 다시 인용하면됩니다 "$(echo "$VAR")".. 예, 구문 분석하는 것은 이상하지만 쉘이 우리보다 분명히 쉽습니다.
OJFord

3

동일한 문제가 발생했습니다. 견적이 도움이 될 것입니다.

ubuntu@host:~/apps$ apps="abc
> def"
ubuntu@host:~/apps$ echo $apps
abc def
ubuntu@host:~/apps$ echo "$apps"
abc
def

2
거의 5 년 후 이전 답변에 새로운 세부 정보를 추가하지 않거나 새로운 솔루션을 제공하지 않고 질문에 답변하는 것은 좋은 생각이 아닙니다. 이러한 종류의 답변을 게시하지 마십시오.
MAChitgarha

1
당신의 "거의 오년"의 정밀도를 사랑 @MAChitgarha :)
닐 Gatenby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.