for 루프 전에 IFS를 일시적으로 변경합니다.

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

답변1

for예약어이므로 다음과 같습니다.특별한 규칙:

다음 단어는 예약어로 간주되어야 합니다.

! { } 케이스 완료 elif else esac fi for if in then Until while

이 인식은 문자가 인용되지 않고 단어가 다음과 같이 사용되는 경우에만 발생합니다.

  • 명령의 첫 번째 단어

  • 다음 예약어를 제외한 예약어 뒤의 첫 번째 단어사례,~을 위한, 또는존재하다

  • Case 명령의 세 번째 단어(만존재하다이 경우 유효함)

  • for 명령의 세 번째 단어(만존재하다그리고하다이 경우 유효함)

당신이 시도한다면

IFS=":" for i in $PATH; do echo $i; done

for그러면 위의 규칙에 따르면 키워드가 명령의 첫 번째 단어가 아니기 때문에 이는 루프가 아닙니다 . 하지만 원하는 결과를 얻을 수 있습니다

tr ':' '\n' <<< "$PATH"               #Bash, Ksh, Zsh
printf "%s\n" "$PATH" | tr ':' '\n'   #Any standard shell

이들 각각은 개행 문자로 tr대체됩니다 .:


여러분은 다음과 같은 효과적인 방법에 익숙할 것입니다.

while IFS= read -r line; do

while은 명령의 첫 번째 단어이고 IFS할당이 적용되므로 read모든 것이 잘 작동합니다.

답변2

셸 매크로 할당은 간단한 명령(예: read) 앞에는 허용되지만 복합 명령문(예: ) 앞에는 허용되지 않습니다 for.

권장 용도:

OIFS=$IFS
IFS=:
some complex commands
IFS=$OIFS

관련 정보