"IFS" 변수란 무엇입니까?

"IFS" 변수란 무엇입니까?

나는 이 Q&A를 읽고 있습니다:파일의 줄을 반복하는 방법은 무엇입니까?

변수란 무엇입니까 IFS? -loops 와 관련하여 그 용도는 무엇입니까 for?

답변1

IFS이는 루프와 직접적인 관련이 없으며 분사와 관련이 있습니다. IFS명령 출력이 루프 반복의 조각으로 분할되는 방식을 간접적으로 결정합니다.

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

  • "$foo"대체가 큰따옴표 사이에 있거나 변수 할당에 있는 경우와 같이 컨텍스트에 단일 단어가 필요한 경우 x=$foo대체 결과로 생성된 문자열이 그대로 사용됩니다.
  • 컨텍스트에 두 개 이상의 단어가 필요한 경우(대부분의 경우) 결과 문자열에 대해 두 가지 추가 확장이 수행됩니다.
    • 문자열은말로. 에 나타나는 모든 문자는 $IFS단어 구분 기호로 간주됩니다. 예를 들어 IFS=":"; foo="12:34::78"; echo $foo인쇄됩니다( 12 34 ​ 78빈 단어가 있기 때문에 및 사이에 두 개의 공백이 있습니다).3478
    • 각 단어는 전역 패턴으로 처리되며파일 이름 목록으로 확장됩니다.. 예를 들어, foo="*"; echo $foo현재 디렉터리에 있는 파일 목록을 인쇄합니다.

다른 많은 컨텍스트와 마찬가지로 for 루프에는 단어 목록이 필요합니다. 그래서

for x in $(foo); do …

이를 단어로 나누고 $(foo)각 단어를 전역 패턴으로 처리합니다. IFS기본값은 다음과 같습니다.공백, 탭 및 줄 바꿈, 따라서 foo두 줄을 인쇄한 hello world다음 및 를 사용하여 howdy루프 본문을 실행합니다. 개행만 포함하도록 명시적으로 변경된 경우 및 에서 루프가 수행됩니다. 로 변경하면 , , (여기서 개행 문자) 및 에 대해 루프가 수행됩니다.x=hellox=worldx=howdyIFShello worldhowdyIFSohell​ wrld​␤h​␤wdy

답변2

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

그런데 게시한 답변으로 판단하면 두 번째 솔루션이 권장되는 솔루션입니다.

~처럼@jasonwryan눈치채긴 Input했지만 Internal. 이름 Input의 유래에는 - awk도 포함됩니다 .OFSOutput Field Separator

답변3

~에서man bash

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

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

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

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

답변4

훌륭한 이전 답변 외에도 다음을 추가하고 싶습니다.IFS효율적이고 휴대 가능한 구문 분석을 위해 간단한 사례와 함께 유용합니다.놓다. 서브셸 및 빌드 도구(예: 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스크립트의 다른 부분이 실수로 손상되는 것을 방지합니다.

관련 정보