Linux shell. for 문에서 줄바꿈을 기준으로 반복문 실행하기
lists라는 변수에는 다음과 같은 내용이 저장되어있습니다.
$ lists=`find . -type f`
./a/a
./b/b
./d/d
저는 다음 for문을 실행시켰습니다.
for i in "$lists"; do echo $i; echo 1; done
저는 다음과 같은 결과가 출력 되리라고 예상했습니다.
./a/a
1
./b/b
1
./d/d
1
하지만 결과는 다음과 같습니다.
./a/a
./b/b
./d/d
1
줄 바꿈을 기준으로 나누어서 실행될 것이라고 예상했으나..
줄바꿈 마저도 하나의 텍스트로써 i 안에 넣어서 실행해버리더군요.
쌍따옴표를 없애서 아래 명령도 수행해봤습니다.
for i in $lists; do echo $i; echo 1; done
구글에 검색해봐도 뭐라 해야 할지 모르겠습니다.
for 문을 영어로 뭐라 검색해야 할지도 모르겠고;;ㅋ꙼̈ㅋ̊̈ㅋ̆̈
for라고 검색하면 구글이 이 for를 for문이 아니라 전치사로 인식해버려요;;
for문은 영어로 for loop라고 한다고 합니다.
좀 더 찾아봐야겠네요.ㅎㅎ
원인을 찾았습니다.
zsh 때문이었습니다.
shell의 미용(?)을 위해 zsh를 사용하고 있었는데
이 내용을 그대로 shell 파일로 만들어서 #!/bin/bash로 설정했더니
매우 잘됩니다.
#!/bin/zsh로 하면 역시나 질문 글과 같은 문제가 발생합니다.
zsh에서는 line by line으로 for loop 돌리는 방법을 찾아봐야겠습니다.
오.. 역시 자가해결이..짱이군요 ㅎㅎ..
스크립트같은경우에는 대부분 #!/bin/bash로 사용하고있어서 레퍼런스도 그쪽이 많을것같긴합니다
스크립트에서는 bash로 하면 해결이 가능하지만, bash는 너무 못생겼는데다가..
오라클 여러 기기 관리하다보면 지금 보고 있는데 A1인지, E2 인지 헷갈려서
zsh를 선호하고 있습니디.
UI(?)의 색상과 모양으로부터 구분이 가능하니까 명령줄 시작 부분이나 터미널 창을 안보고 구분 가능하다는 점에서 좋아하는데 이런 문제가 있는 줄은 몰랐습니다.
역시 스택 오버 플로우 최고입니다.
제가 사용한 for 문 대신 while 문으로 사용하여 해결 가능하다고 합니다.
문제가 된 for 문
for i in "$lists"; do echo $i; echo 1; done
해결방안으로 찾아낸 while 문
while read -r i; do echo "$i 1"; done <<< "$lists"
cmt alert