Bash 쉘 스크립트는 다음 줄로 시작됩니다.
IFS=$'\n'
이 기호 세트 뒤에 숨은 의미는 무엇입니까?
답변1
IFS
"내부 필드 구분 기호"를 나타냅니다. 쉘은 이를 사용하여 단어 분할을 수행하는 방법, 즉 단어 경계를 인식하는 방법을 결정합니다.
bash와 같은 셸에서 이것을 시도해 보세요(zsh와 같은 다른 셸에서는 이를 다르게 처리할 수 있습니다).
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
기본값은 IFS
공백 문자(정확히 말하면 공백, 탭 및 줄 바꿈)로 구성됩니다. 각 문자는 단어 경계가 될 수 있습니다. 따라서 기본값을 사용하여 IFS
위 루프는 다음을 인쇄합니다.
Word: foo:bar
Word: baz
Word: rab
즉, 쉘은 공백을 단어 경계로 간주합니다.
이제 IFS=:
루프를 실행하기 전에 설정해 보세요. 이번 결과는 다음과 같습니다.
Word: foo
Word: bar baz rab
이제 쉘 mystring
도 단어로 분할되지만 이제는 콜론만 단어 경계로 처리합니다.
의 첫 번째 문자는 특별합니다. 특수 변수를 사용할 때 출력에서 단어를 구분하는 IFS
데 사용됩니다 (예:$*
고급 Bash 스크립팅 가이드, 이러한 특수 변수에 대한 자세한 정보를 찾을 수도 있습니다):
$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
비교:
$ bash -c 'set w x y z; IFS="-:;"; echo "$*"'
w-x-y-z
두 예 모두에서 쉘은 여전히 모든 문자 :
및 단어 경계를 -
처리 합니다. ;
변화하는 유일한 것은 행동입니다 $*
.
알아야 할 또 다른 중요한 점은 소위 "IFS 공백"이 어떻게 구현되는지입니다.치료를 받다. 기본적으로 IFS
공백 문자가 포함되면 문자열이 처리되기 전에 분할되는 문자열에서 앞뒤 공백이 제거되고,주문하다연속 공백 문자도 필드를 구분합니다. 그러나 이는 실제로 존재하는 공백 문자에 대해서만 작동합니다 IFS
.
"a:b:: c d "
예를 들어, 문자열(후행 공백과 및 사이에 두 개의 공백 문자)을 살펴보겠습니다 .c
d
- 이는 , , (빈 문자열) 및 (다시 말하지만, 및 사이에 두 개의 공백)
IFS=:
의 4개 필드로 분할됩니다 . 마지막 필드의 선행 및 후행 공백을 기록해 두십시오."a"
"b"
""
" c d "
c
d
- 를 사용하면 , , (빈 문자열) 및
IFS=' :'
의 5개 필드로 나뉩니다 . 어디에도 선행 및 후행 공백이 없습니다."a"
"b"
""
"c"
"d"
두 번째 예에서는 여러 개의 연속된 공백 문자가 두 필드를 구분하지만 여러 개의 연속된 콜론은 공백 문자가 아니기 때문에 구분하지 않습니다.
에 관해서는 이는 , FreeBSD(모든 쉘 간에 변경됨)에서도 지원되는 구문 IFS=$'\n'
입니다 . ksh93
Bash 매뉴얼 페이지를 인용하면 다음과 같습니다.bash
zsh
mksh
sh
$'string' 형식의 단어는 특별하게 처리됩니다. 단어는 ANSI C 표준에 지정된 대로 대체된 백슬래시 이스케이프 문자를 사용하여 "string"으로 확장됩니다.
\n
개행 문자에 대한 이스케이프 시퀀스이므로 IFS
결국 단일 개행 문자로 설정됩니다.
답변2
달러 작은따옴표 내에서 특정 문자는 특별히 평가됩니다. 예를 들어, \n
새 줄로 변환됩니다.
따라서 이 줄은 변수 IFS에 개행 문자를 할당합니다. IFS는 bash의 특수 변수인 내부 필드 구분 기호입니다. 말했듯 이 man bash
, 그것은
확장된 단어 분할에 사용되며
read
내장 명령을 사용하여 줄을 단어로 분할합니다. 기본값은 입니다<space><tab><newline>
.
답변3
즉, 변수에 IFS=$'\n'
개행 문자를 할당합니다 .\n
IFS
$'string'
구문은 ANSI C와 유사한 이스케이프 시퀀스를 디코딩하기 위한 인용 메커니즘입니다. 이 구문은 , 에서 유래되었으며 , , 와 같은 ksh93
최신 셸로 이식 가능합니다 .bash
zsh
pdksh
busybox sh
이 구문은 POSIX에서 정의되지 않았지만 허용됩니다.SUS 7호.
답변4
$IFS
나는 예를 들어 설명하는 것을 선호합니다:
cp 또는 mv 또는 기타 파일 처리를 원하는 Suppsoe, 파일에 다음과 같은 메타 문자나 공백이 있는 경우 IFS는 기본적으로 비어 있습니다.
Linux Administration.pdf
또는 Free Software Fundation.ogg
다음과 같은 이유로 문제가 발생합니다. Linux는 별도의 매개변수를 고려하고 관리는 고려합니다. 단일 매개변수. 따라서 bash에는 가 있으므로 built-in variable
로 초기화할 수 IFS==$(echo -en "\n\b")
있으며 bash는 파일 이름 사이의 모든 메타 문자와 공백을 버립니다. 예를 들면 다음과 같습니다.
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
mymusicdir=~/test/dd
find $mymusicdir -name "*" -execdir rename 's/ /_/g' "{}" +
IFS=$SAVEIFS