zsh: 개행으로 구분된 항목에 대한 for 루프

zsh: 개행으로 구분된 항목에 대한 for 루프

변수가 있습니다.

❯ echo $numholds     
409503
409929
409930
409932
409934
409936
409941
409942
409944
409946

for 루프를 만들고 싶지만 개행 구분이 작동하지 않습니다.

❯ for num in $numholds; do
echo $num ,
echo New Item!
> done                         
409503
409929
409930
409932
409934
409936
409941
409942
409944
409946 ,
New Item!

심지어 내가 그것을 설정할 때에도 이런 일이 발생합니다 IFS=$"\n \t". 어떻게 해야 하나요?

답변1

zsh에서 줄 바꿈으로 분할하려면 다음을 사용할 수 있습니다.f 매개변수 확장 플래그( f을 위한라인 f수요)는 다음의 약어입니다 ps:\n:.

for num (${(f)numholds}) print -r New item: $num

-splitting을 사용할 수도 있습니다 $IFS. 여기서 zsh(다른 Bourne 유사 쉘과 달리) 사용해야 합니다.$=param통사론( $=가위처럼 생겼어요):

for num ($=numholds) print -r New item: $num

답변2

변수는 배열이 아닌 문자열입니다. 개행 문자가 포함되어 있다는 것은 관련이 없습니다. for num in $numholds저장하는 방식이므로 전체를 단일 값으로 취급합니다 .

간단한 해결책은 while루프와 <<<here-string 구문을 사용하여 이를 제공하는 것입니다.

% while read num; do echo "$num"; echo "New Item"; done <<<"$numholds"
409503
New Item
409929
New Item
409930
New Item
409932
New Item
409934
New Item
409936
New Item
409941
New Item
409942
New Item
409944
New Item
409946
New Item

이는 본질적으로 보기 흉한 결과를 낳습니다(참조:여기이것이 나쁜 생각인 이유):

% for num in $(echo "$numholds"); do echo $num; echo "new item"; done
409503
new item
409929
new item
409930
new item
409932
new item
409934
new item
409936
new item
409941
new item
409942
new item
409944
new item
409946
new item

마지막으로 변수를 배열로 변경할 수 있습니다.

numArray=($(echo "$numholds"))

이제 원하는 구성을 사용할 수 있습니다.

% for num in "${numArray[@]}"; do echo $num; echo "new item"; done                   
409503
new item
409929
new item
409930
new item
409932
new item
409934
new item
409936
new item
409941
new item
409942
new item
409944
new item
409946
new item
tpad% 

관련 정보