'IFS'란 무엇입니까?


답변:


17

IFS의 약자 -필드를 구분하는 문자입니다. 게시 한 예에서는 개행 문자 ( )로 설정됩니다 . 설정 한 후에 텍스트를 한 줄씩 처리합니다. 이 예에서는 값을 (입력 파일에있는 문자로) 변경하고 텍스트가 어떻게 분할되는지 확인할 수 있습니다.Input Internal Field Separator\nforIFS

BTW, 두 번째 해결책을 게시 한 답변에서 권장하는 것이 있습니다 ...

으로 @jasonwryan가 발견, 그렇지 않아 Input있지만 Internal. 이름 도 - 에서 Input왔다 .awkOFSOutput Field Separator


1
IFS는 출력 매개 변수를 결합하는 데에도 사용됩니다. bash 매뉴얼 페이지에서 : "큰 따옴표 안에 확장이 발생하면 각 매개 변수의 값이 IFS 특수 변수의 첫 문자로 분리되어 단일 단어로 확장됩니다."
Eric

하나는 그 동안주의해야 S위해이었다 세퍼레이터 가 시작된 본 쉘이다. Korn 쉘과 현재로 지정된 대부분의 Bourne과 같은 쉘 POSIX에서 Sis는 Delimiter 용입니다 ( A::B:예를 들어 상상력을 조금 늘리십시오). 예를 들어 "A", ""및 "B"(추가 없음 ""). awkFS또는 s매개 변수 확장 플래그와 다릅니다 zsh.
Stéphane Chazelas

27

IFS루핑과 직접 관련이 없으며 단어 분리와 관련이 있습니다. IFS명령의 출력이 루프가 반복되는 부분으로 분할되는 방식을 간접적으로 결정합니다.

보호되지 않은 변수 대체 $foo또는 명령 대체 $(foo)가있는 경우 두 가지 경우가 있습니다.

  • 문맥이 단일 단어를 예상하는 경우 (예 : 대체가 큰 따옴표 사이 "$foo"또는 변수 할당 내에있는 x=$foo경우) 대체의 결과로있는 문자열이 그대로 사용됩니다.
  • 문맥에 여러 단어가 필요한 경우 (대부분의 경우) 결과 문자열에 대해 두 개의 추가 확장이 수행됩니다.
    • 문자열은 단어나뉩니다 . 나타나는 모든 문자 $IFS는 단어 구분 기호로 간주됩니다. 예를 들어 빈 단어가 있기 때문에 와 사이에 공백이 두 개있는 IFS=":"; foo="12:34::78"; echo $foo인쇄12 34 ​ 783478
    • 각 단어는 glob 패턴으로 취급되며 파일 이름 목록으로 확장됩니다 . 예를 들어, foo="*"; echo $foo현재 디렉토리의 파일 목록을 인쇄합니다.

For 루프는 다른 많은 컨텍스트와 마찬가지로 단어 목록을 기대합니다. 그래서

for x in $(foo); do 

휴식 $(foo)단어로, 그리고 취급합니다 글로브 패턴으로 각 단어. 의 디폴트 값은 IFS이다 공백, 탭과 개행 그렇다면, foo이 개 라인 밖으로 인쇄 hello world하고는 howdy다음 루프 본문이 함께 실행 x=hello한 후, x=world하고 x=howdy. IFS개행 문자 만 포함하도록 명시 적으로 변경된 경우 hello world및에 대해 루프가 실행됩니다 howdy. 경우 IFS로 변경되어 o, 다음 루프가 실행된다 hell, ​ w, rld​␤h(여기서, ​␤개행 문자 임)와 wdy.


왜 "간접적으로"을 언급 "IFS indirectly determines how ..."했습니까?
αғsнιη

1
@ αғsнιη IFS(직접)는 명령 대체의 출력이 어떻게 분리되는지를 결정하고, 그 다음에 (루프가 루프되는 것을 간접적으로) 결정합니다.
Gilles 'SO- 악마 그만해

5

에서 man bash

IFS 확장 후 단어 분리 및 read 내장 명령을 사용하여 행을 단어로 분할하는 데 사용되는 내부 필드 구분 기호입니다. 기본값은 "<space> <tab> <newline>"입니다.

이것은 Bash의 내부 변수 중 하나입니다. Bash가 문자열을 해석 할 때 필드 또는 단어 경계를 인식하는 방법을 결정합니다.

기본값은 공백 (공백, 탭 및 줄 바꿈)이지만 쉼표로 구분 된 데이터 파일을 구문 분석하기 위해 변경 될 수 있습니다.

http://tldp.org/LDP/abs/html/internalvariables.html


0

이전의 훌륭한 답변 외에도 IFSset 과 함께 간단한 경우에 효율적이고 이식 가능한 구문 분석에 매우 유용하다는 점을 추가하겠습니다 . grep 또는 sed와 같은 서브 쉘 및 스폰 도구를 사용하지 않기 때문에 효율적입니다.

resolutions="640x480,320x240"
xIFS=$IFS
IFS=','
for res in $resolutions; do
    xxIFS=$IFS
    IFS='x'
    set -- $res
    width=$1
    height=$2
    # handle width and height
    IFS=$xxIFS
done;
IFS=$xIFS

스크립트의 다른 부분에서 원하지 않는 손상을 피하려면 IFS의 이전 값을 저장하고 복구해야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.