나는이 스레드를 읽고 있었다 : 파일의 라인을 반복하는 방법?
무엇입니까 IFS
? 그리고 for
-loops 와 관련하여 사용법은 무엇 입니까?
답변
IFS
의 약자 -필드를 구분하는 문자입니다. 게시 한 예에서는 개행 문자 ( )로 설정됩니다 . 설정 한 후에 텍스트를 한 줄씩 처리합니다. 이 예에서는 값을 (입력 파일에있는 문자로) 변경하고 텍스트가 어떻게 분할되는지 확인할 수 있습니다.Input
Internal Field Separator
\n
for
IFS
BTW, 두 번째 해결책을 게시 한 답변에서 권장하는 것이 있습니다 …
으로 @jasonwryan가 발견, 그렇지 않아 Input
있지만 Internal
. 이름 도 – 에서 Input
왔다 .awk
OFS
Output Field Separator
답변
IFS
루핑과 직접 관련이 없으며 단어 분리와 관련이 있습니다. IFS
명령의 출력이 루프가 반복되는 부분으로 분할되는 방식을 간접적으로 결정합니다.
보호되지 않은 변수 대체 $foo
또는 명령 대체 $(foo)
가있는 경우 두 가지 경우가 있습니다.
- 문맥이 단일 단어를 예상하는 경우 (예 : 대체가 큰 따옴표 사이
"$foo"
또는 변수 할당 내에있는x=$foo
경우) 대체의 결과로있는 문자열이 그대로 사용됩니다. - 문맥에 여러 단어가 필요한 경우 (대부분의 경우) 결과 문자열에 대해 두 개의 추가 확장이 수행됩니다.
- 문자열은 단어 로 나뉩니다 . 나타나는 모든 문자
$IFS
는 단어 구분 기호로 간주됩니다. 예를 들어 빈 단어가 있기 때문에 와 사이에 공백이 두 개있는IFS=":"; foo="12:34::78"; echo $foo
인쇄12 34 78
34
78
- 각 단어는 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
, rldh
(여기서, 
개행 문자 임)와 wdy
.
답변
에서 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의 이전 값을 저장하고 복구해야합니다 .