‘IFS’란 무엇입니까? 스레드를 읽고

나는이 스레드를 읽고 있었다 : 파일의 라인을 반복하는 방법?

무엇입니까 IFS? 그리고 for-loops 와 관련하여 사용법은 무엇 입니까?



답변

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

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

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


답변

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.


답변

에서 man bash

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

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

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

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


답변

이전의 훌륭한 답변 외에도 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의 이전 값을 저장하고 복구해야합니다 .