답변:
IFS 변수는 쉘이 단어 splitting 이라는 작업을 수행 할 때마다 사용됩니다 . 이것이 사용되는 가장 일반적인 경우는 $var
명령에서 매개 변수 확장 (예 $(some-command)
:) 또는 명령 대체 (예 : 더 이상 사용되지 않는 백틱) 후입니다. 확장에 IFS
문자 가 포함되어 있으면 명령이 처리되기 전에 다른 '단어'로 분할됩니다. 사실상 이것은 이러한 문자가 대체 된 텍스트를 다른 인수로 분리 함을 의미합니다 (변수가 먼저 지정된 경우 명령 이름 포함).
따라서 IFS
공백, 탭 및 줄 바꿈이 기본값 인 이유 는 일반적으로 단어를 나눌 것으로 예상되는 공백 문자이기 때문입니다.
단어 분리를 방지하는 한 가지 방법은 확장 ( "$var"
) 주위에 큰 따옴표를 사용하는 것 입니다. 실제로 질문에서이 작업을 수행했습니다. 이 작업을 수행하지 않으면 echo
인수가없고 인수를 나누는 문자 만 출력되므로 출력 이 없습니다.
단어 분할이 두 곳 것도 참고 하지 않는 매개 변수 확장 후 발생이 변수 할당에있다 (예를 들면 var=$othervar
및 var=$(somecommand)
괜찮습니다), 그리고 내부 [[ ]]
구조 ( [[ $var = $othervar ]]
확인하지만, [ $var = $othervar ]
인용한다).
마지막으로, 현명한 사람이 한 번 지적한 것처럼, 일반적인 오해는 단어 분리 방지가 변수를 인용하는 유일한 이유 라는 것입니다 . 인용 부호는 경로 이름 확장 또는 glob 확장 이 더 일반적으로 알려진 것을 방지하지도 않습니다 . 변수에 glob 문자가 포함 *
된 경우 명령에서 변수를 인용 부호로 사용하지 않으면 파일 이름으로 확장 될 수 있습니다. 예를 들어 :
var=*
echo $var
현재 디렉토리에있는 파일 이름이 표시됩니다.
Stephane이 아래 에서 지적한 것처럼 , IFS
확장 할 때 문자 순서 가 중요 "$*"
합니다. 로부터 bash
매뉴얼 페이지
"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable. If IFS is unset, the parameters are separated by spaces. If
IFS is null, the parameters are joined without intervening separators.
단어 분리의 더 많은 예는 다음 답변을 참조하십시오-https: //unix.stackexchange.com/a/118444/48083
zsh
NUL 문자를 기본값으로 포함합니다 $IFS
(다른 쉘은 변수에 NUL 문자를 포함하는 것을 지원하지 않습니다).
$IFS
도에 사용"$*"
되는 이유는 순서의 문제이다.