IFS
변수를 bash
공백으로 설정하면 여러 공백을 하나의 공백으로 취급합니다 ( myprogram
받은 명령 줄 인수를 인쇄하는 프로그램).
IFS=" "
x="hello hi world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world
그러나 IFS
변수를 쉼표로 설정하면 bash
여러 쉼표를 하나의 쉼표로 취급하지 않습니다.
IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] =
argv[3] =
argv[4] = hi
argv[5] =
argv[6] =
argv[7] = world
왜 그런 겁니까?
이것은에 문서화되어 man bash
있습니다. IFS에서 공백이 아닌 문자의 단일 발생은 필드를 구분합니다.
에서 man bash
:
쉘은 IFS의 각 문자를 구분 기호로 취급하고 이러한 문자를 필드 종결 자로 사용하여 다른 확장의 결과를 단어로 분할합니다. IFS가 설정되지 않은 경우, 또는 그 값이 정확히 경우
<space><tab><newline>
다음의 순서 기본<space>
,<tab>
및<newline>
시작과 이전 확장의 결과의 끝에서 무시되고 IFS 문자의 순서가 아니라 시작 부분이나 끝 구분하는 역할을 말. IFS에 기본값이 아닌 값이있는 경우 공백 문자가 IFS (IFS 공백 문자) 값에있는 한 단어의 시작과 끝에서 공백 문자 공백, 탭 및 줄 바꿈의 시퀀스는 무시됩니다. ).IFS 공백이 아닌 IFS의 모든 문자는 인접한 IFS 공백 문자와 함께 필드를 구분합니다. 일련의 IFS 공백 문자도 구분 기호로 처리됩니다. IFS 값이 널이면 단어 분할이 발생하지 않습니다. [강조 추가.]
IFS에 공백 문자가 없으면 공백이 필드에 포함됩니다.
$ ( IFS=',' x='one , two,three'; printf "<%s>\n" $x )
<one >
< two>
<three>
IFS에 공백과 쉼표가 모두있는 경우 공백 시퀀스, 쉼표, 공백 시퀀스가 단일 구분 기호로 처리됩니다.
$ ( IFS=' ,' x='one , two,three'; printf "<%s>\n" $x )
<one>
<two>
<three>
쉼표 시퀀스는 빈 필드 시퀀스로 해석됩니다.
$ ( IFS=' ,' x='one,,,two,three'; printf "<%s>\n" $x )
<one>
<>
<>
<two>
<three>
IFS에 공백이 없으면 선행 및 후행 공백이 필드에 유지됩니다.
$ ( IFS=',' x=' one , two,three ,'; printf "<%s>\n" $x )
< one >
< two>
<three >
IFS에 공백이 포함 된 경우 공백의 선행 또는 후행 시퀀스가 제거됩니다.
$ ( IFS=' ,' x=' one , two,three ,'; printf "<%s>\n" $x )
<one>
<two>
<three>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다