2012-08-10 3 views

답변

21

는 다음과 같은 여러 줄 변수

x=$(echo -e "a\nb\nc d e") 

각 라인에 대한 간단한 과정을 고려 : 단지 echo이 접두사 = LINE:와 라인 주변에 작은 따옴표와. 다음 코드 중 하나는 요구 사항을 만족 :

while read line; do echo "LINE: '${line}'"; done <<< "$x" 

또는

while read line; do echo "LINE: '${line}'"; done < <(echo "$x") 

어느

는 서브 쉘을 (그래서 당신은, 예를 들어, 루프에서 변수를 설정하고 외부에서 액세스 할 수 있습니다)을 작성을하고, 출력

LINE: 'a' 
LINE: 'b' 
LINE: 'c d e' 

그러나 당신이 대신 가정 모두

x=$(echo -e "a \n b\nc d e") 
# note--------^--^ 

및 해당 공백 및 공백 문자 (예 : Git 도자기 파싱) 위의 두 코드 모두 전자의 경우와 마찬가지로 후자의 변수/데이터에 대해 정확히 동일한 출력을 제공합니다. 이는 원하는 것이 아닙니다. 선행 및 후행 공백을 보존하려면 while read linewhile IFS= read -r line으로 바꾸십시오. 즉, 다음과 같은 코드

while IFS= read -r line; do echo "LINE: '${line}'"; done <<< "$x" 

또는

while IFS= read -r line; do echo "LINE: '${line}'"; done < <(echo "$x") 

중 하나는
LINE: 'a ' 
LINE: ' b' 
LINE: 'c d e' 

은 자세한 내용 Greg Wooledge's excellent Bash FAQ를 참조 생성합니다.

+0

이것은 완벽한 솔루션입니다. 그냥 궁금 해서요. 왜 x = "a \ nb \ nc d e"가 아니겠습니까? –

+0

@SenthilKumar, 해당 문자열은 'a', '\', 'n', 'b'등 10 개의 문자를 포함합니다. "\ n"은 큰 따옴표 안에 들어 있지 않습니다. bash에서는 문자열에 실제 개행 문자가 포함되도록'$ "a \ nb \ nc d e"'를 쓸 수 있습니다. "-e"플래그는 "\ n"을 새로운 행으로 처리하도록 지시하며, 두 개의 개별 문자가 아니라는 것을 알려줍니다. – chepner

+0

@chepner : thx,'$'는 나에게 새로운 것이지만 작은 따옴표 '$'로 \ nb \ nc d e''를 사용합니다. –

1

일반적으로 "읽는 동안"여러 줄 변수를 처리하는 데 사용하지만 최근에는 파일의 각 줄에서 선행 공백을 제거한 인스턴스가있었습니다. this Unix Stack Exchange answer에서 촬영

printf %s "$var" | while IFS= read -r line 
do 
    echo "$line" 
done 

코드 :이 대신 고정 내 문제를 사용.

관련 문제