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