나는 이 Q&A를 읽고 있습니다:파일의 줄을 반복하는 방법은 무엇입니까?
변수란 무엇입니까 IFS
? -loops 와 관련하여 그 용도는 무엇입니까 for
?
답변1
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
답변2
IFS
- 필드를 구분하는 문자입니다. 게시한 예에서는 newline()으로 설정되어 있으므로 설정하면 텍스트가 한 줄씩 처리됩니다. 예제에서는 (입력 파일의 특정 문자로) 값을 변경하고 텍스트가 어떻게 분할되는지 확인할 수 있습니다.Input
Internal Field Separator
\n
for
IFS
그런데 게시한 답변으로 판단하면 두 번째 솔루션이 권장되는 솔루션입니다.
~처럼@jasonwryan눈치채긴 Input
했지만 Internal
. 이름 Input
의 유래에는 - awk
도 포함됩니다 .OFS
Output Field Separator
답변3
~에서man bash
IFS 내부 필드 구분 기호는 확장 후 단어 분할 및 read 내장 명령을 사용하여 행을 단어로 분할하는 데 사용됩니다. 기본값은 "<space><tab><newline>"입니다.
이것은 Bash의 내부 변수 중 하나입니다. 문자열을 해석할 때 Bash가 필드 또는 단어 경계를 인식하는 방법을 결정합니다.
기본값은 공백(공백, 탭 및 줄 바꿈)이지만 예를 들어 쉼표로 구분된 데이터 파일을 구문 분석하기 위해 변경할 수 있습니다.
답변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스크립트의 다른 부분이 실수로 손상되는 것을 방지합니다.