for 루프 이전에 일시적으로 IFS 변경 [중복]
나는 SHELL
허용 변수 할당이 명령 직전에 발생 한다는 것을 알고 IFS=":" read a b c d <<< "$here_string"
있습니다.
내가 궁금한 것은 루프와 같은 복합 문을 사용할 때 이러한 할당이 작동하지 않는다는 것입니다. 나는 같은 것을 시도했지만 IFS=":" for i in $PATH; do echo $i; done
구문 오류가 발생합니다. 난 항상 뭔가를 할 수있는 oldIFS="$IFS"; IFS=":"; for....; IFS="$oldIFS"
,하지만 난 같은 화합물 문에 같은 인라인 할당 작업을 할 수있는 방법이 있다면 알고 싶어 for
루프?
답변
for
예약어이므로 특수 규칙을 따릅니다 .
다음 단어는 예약어로 인식됩니다.
! {} case do done elif else esac fi for if in then until while
이 인식은 인용 된 문자가없고 단어가 다음과 같이 사용되는 경우에만 발생합니다.
명령의 첫 단어
case , for 또는 in 이외의 예약어 중 하나 뒤에 오는 첫 번째 단어
케이스 명령 번째 워드 (단 에서는 이 경우에 유효)
for 명령의 세 번째 단어 (이 경우 in 및 do 만 유효 함)
시도하면
IFS=":" for i in $PATH; do echo $i; done
위의 규칙에 for
따르면 키워드가 명령의 첫 번째 단어 가 아니므로 루프가 아닙니다. 그러나 당신의 의도는
IFS=: printf '%s\n' $PATH
$PATH
:
예상대로 단어가 분할 되고 각 결과 단어가으로 인쇄되고 printf
그 뒤에 개행 문자가 표시됩니다.
이 유효한 접근 방식에 익숙 할 수 있습니다.
while IFS= read -r line; do
while
은 명령의 첫 번째 단어이고 IFS
할당은에 적용 read
되므로 모두 괜찮습니다.