나는이 스레드를 읽고 있었다 : 파일의 라인을 반복하는 방법?
무엇입니까 IFS
? 그리고 for
-loops 와 관련하여 사용법은 무엇 입니까?
나는이 스레드를 읽고 있었다 : 파일의 라인을 반복하는 방법?
무엇입니까 IFS
? 그리고 for
-loops 와 관련하여 사용법은 무엇 입니까?
답변:
IFS
의 약자 -필드를 구분하는 문자입니다. 게시 한 예에서는 개행 문자 ( )로 설정됩니다 . 설정 한 후에 텍스트를 한 줄씩 처리합니다. 이 예에서는 값을 (입력 파일에있는 문자로) 변경하고 텍스트가 어떻게 분할되는지 확인할 수 있습니다.Input
Internal Field Separator
\n
for
IFS
BTW, 두 번째 해결책을 게시 한 답변에서 권장하는 것이 있습니다 ...
으로 @jasonwryan가 발견, 그렇지 않아 Input
있지만 Internal
. 이름 도 - 에서 Input
왔다 .awk
OFS
Output Field Separator
S
위해이었다 세퍼레이터 가 시작된 본 쉘이다. Korn 쉘과 현재로 지정된 대부분의 Bourne과 같은 쉘 POSIX
에서 S
is는 Delimiter 용입니다 ( A::B:
예를 들어 상상력을 조금 늘리십시오). 예를 들어 "A", ""및 "B"(추가 없음 ""). awk
의 FS
또는 s
매개 변수 확장 플래그와 다릅니다 zsh
.
IFS
루핑과 직접 관련이 없으며 단어 분리와 관련이 있습니다. IFS
명령의 출력이 루프가 반복되는 부분으로 분할되는 방식을 간접적으로 결정합니다.
보호되지 않은 변수 대체 $foo
또는 명령 대체 $(foo)
가있는 경우 두 가지 경우가 있습니다.
"$foo"
또는 변수 할당 내에있는 x=$foo
경우) 대체의 결과로있는 문자열이 그대로 사용됩니다.$IFS
는 단어 구분 기호로 간주됩니다. 예를 들어 빈 단어가 있기 때문에 와 사이에 공백이 두 개있는 IFS=":"; foo="12:34::78"; echo $foo
인쇄12 34 78
34
78
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
, rldh
(여기서, 
개행 문자 임)와 wdy
.
"IFS indirectly determines how ..."
했습니까?
IFS
(직접)는 명령 대체의 출력이 어떻게 분리되는지를 결정하고, 그 다음에 (루프가 루프되는 것을 간접적으로) 결정합니다.
에서 man bash
IFS 확장 후 단어 분리 및 read 내장 명령을 사용하여 행을 단어로 분할하는 데 사용되는 내부 필드 구분 기호입니다. 기본값은 "<space> <tab> <newline>"입니다.
이것은 Bash의 내부 변수 중 하나입니다. Bash가 문자열을 해석 할 때 필드 또는 단어 경계를 인식하는 방법을 결정합니다.
기본값은 공백 (공백, 탭 및 줄 바꿈)이지만 쉼표로 구분 된 데이터 파일을 구문 분석하기 위해 변경 될 수 있습니다.
이전의 훌륭한 답변 외에도 IFS 가 set 과 함께 간단한 경우에 효율적이고 이식 가능한 구문 분석에 매우 유용하다는 점을 추가하겠습니다 . 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의 이전 값을 저장하고 복구해야합니다 .