Bash는 "IFS" 변수의 값에 따라 동작을 변경합니다.

Bash는 "IFS" 변수의 값에 따라 동작을 변경합니다.

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

왜 그런 겁니까?

답변1

이는 man bash.IFS에 기록됩니다. 공백이 아닌 문자가 있으면 필드가 구분됩니다.

에서 man bash:

쉘은 IFS의 각 문자를 구분 기호로 처리하고 이러한 문자를 필드 종결자로 사용하여 다른 확장 결과를 단어로 분할합니다. IFS가 설정되지 않았거나 해당 값이 기본값인 경우 <space><tab><newline>이전 확장 결과의 시작과 끝 부분에 있는 , 및 시퀀스는 무시되고 <space>시작 <tab>이나 끝에 있지 않은 IFS 문자 시퀀스는 구분하는 데 사용됩니다. <newline>단어. 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>

관련 정보