변수에 저장된 여러 줄 문자열 반복


17

나는 다음 과 같은 것을 쓰는 것이 좋지 않다는 것을 읽었for line in $(command) 으며 올바른 방법은 대신 보입니다.

command | while IFS= read -r line; do echo $line; done

이것은 잘 작동합니다. 그러나 내가 반복하고 싶은 것이 명령의 직접적인 결과가 아닌 변수 의 내용이라면 ?

예를 들어, 다음 파일을 작성한다고 가정하십시오 quickfox.

The quick brown
foxjumps\ over -
the
lazy ,
dog.

다음과 같이 할 수 있기를 바랍니다.

# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect

답변:


19

bash 및 zsh와 같은 최신 셸에서는 문자열을 입력으로 받아들이는 매우 유용한`<<< '리디렉터가 있습니다. 그래서 당신은 할 것입니다

while IFS= read -r line ; do echo $line; done <<< "$variable"

그렇지 않으면, 당신은 항상 할 수 있습니다

echo "$variable" | while IFS= read -r line ; do echo $line; done

미안, 물론 내용을 에코하는 것에 대해 생각해야했습니다. 어쨌든 빠른 답변에 감사드립니다!
Sheljohn

1
$variable사용할 때 큰 따옴표 를 사용해야합니다. 그렇지 않으면 while루프는 한 줄의 입력 만 가져옵니다. 예를 들어 echo $variablevs echo "$variable"또는 cat <<< $variablevs의 출력 차이를 참조하십시오 cat <<< "$variable".
cas

@cas 실제로 $ variable 안에 무엇이 있는지에 달려 있습니다. OP ( "variable = $ (cat quickfox)")로 표시되는 경우 추가 인용없이 작동합니다. 그러나 일반적인 경우에는 옳습니다. 내 답변을 편집합니다. 감사.
lgeorget

variable=$(cat quickfox)영업의 질문에 자신은 내가 무슨 말을하는지의 예를 제공합니다. $variable큰 따옴표 안에 사용 하면 개행 문자가 포함되며 개행 문자를 사용하지 않고 셸에서 공백으로 변환합니다. 한 줄씩 읽고 처리하는 경우 큰 차이가 있습니다. 전자는 입력 라인이 여러 개이고 후자는 입력 라인이 하나뿐입니다. 입력 데이터는 표면적으로 유사하지만 실제로는 두 경우에서 완전히 다릅니다.
cas

예를 들어, 해당 입력 데이터 cat <<< "$variable" | wc -l로 5를 cat <<< $variable | wc -l반환합니다. 그것들은 모두 각각의 "단어"사이에 하나의 공백으로 변형 될 것입니다.
cas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.