`IFS = $ '\ n'의 '\ n'은 변수입니까?


12

개행을 설정하려면 IFS$를 접두사로 사용해야합니다.

IFS=$'\n'

그러나 콜론을 설정하면

IFS=:

가요 \n변수는?

답변:


21

그건 $'...'에서 bash확장 매개 변수 아니다, 그것은 도입 인용의 특별한 종류의 ksh93그 사람을 확장 \n, \x0a, \12개행 문자 코드. zsh또한 추가되었습니다 \u000a. ksh93그리고 bash또한이 \cj중에 zsh있습니다 \C-J. ksh93와 같은 유사 콘텐츠도 지원합니다 \x{a}.

이것은 $어떤 형태 또는 확장이라는 신호입니다. 그러나 어쨌든 큰 따옴표 또는 여기 문서 ( POSIX에 따라 지정되지 않지만 모든 쉘의 출력) 에서 수행 되지 않으며 확장이 분할되지 않는다는 점에서 사용하는 다른 확장 형식과 다릅니다 $(예 $((1 + 1)): $param또는 $(cmd)) + 글로벌 확장 연산자보다 인용 연산자에 더 가깝습니다.echo "$'x'"$'x'

IFS=\nIFS를 n( \인용 연산자로 처리)로 설정 IFS="\n"하거나 IFS='\n'IFS를 두 문자 백 슬래시 및로 설정 n합니다.

다음을 사용할 수도 있습니다.

IFS='
'

또는

IFS="
"

또는

IFS=$'
'

리터럴 개행을 전달하는 것은 읽기 쉽지 않지만 ( 코드에 다른 공백 문자가 포함 set list되어 vi있는지 여부 와 같은 것을 사용하는 것 외에는 볼 수 없습니다 $IFS).

IFS=:, IFS=':', IFS=":", IFS=$':'모든 설정 IFS :사용이 문제가되지 않도록.

$'...'적어도 그래피 (변형으로)지지되어 ksh93, zsh, bash, mksh, 비지 shFreeBSD의 sh. ksh93그리고 bash또한이 $"..."드물게 배포하고 이식하고 안정적으로 사용하는 그것의 복잡으로 사용되지 비록 텍스트의 현지화에 사용되는 따옴표의 양식을.

esfish껍질도 사용할 수 있습니다 \n개행 문자로 확장 따옴표의 외부.

와 같은 일부 도구는 printf구현 echo또는 자체 awk확장 할 수 있습니다 \n. 예를 들어, 다음을 수행 할 수 있습니다.

printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only

줄 바꿈 문자를 출력하지만 다음 사항에 유의하십시오.

IFS = $ (printf '\ n')

명령 대체 ( $(...))는 후행 줄 바꿈 문자를 모두 제거 하므로 작동하지 않습니다 . 그러나 다음을 사용할 수 있습니다.

eval "$(printf 'IFS="\n"')"

개행 문자가 아닌 문자 로 printf끝나기 때문에 작동합니다 ".

이제, 완전성을 위해 상기에 rc쉘 및 유도체 (같은 es또는 akanga) $'\n'실제로 그것의 확장 인 \n변수 (이름이 변수는 두 문자의 시퀀스이다 \하고 n). 이러한 쉘에는 변수 이름에 포함 할 수있는 문자에 대한 제한이 없으며 한 가지 유형의 따옴표 만 있습니다 '...'.

$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo

rc변수도 모두 환경으로 내보내 지지만 적어도의 유닉스 변형에서는와 rc같은 변수 이름의 \n경우 환경 변수 버전은 인코딩 형식을 겪습니다.

; env | grep foo | sed -n l
__5cn=foo\001bar$

( 0x5cASCII의 바이트 값입니다 \. 배열 변수가 0x1 바이트로 구분 기호로 인코딩 된 방법도 참조하십시오).


1
+1비인간적 인 지식 수준
Steven Penny

10

이것은 ANSI-C 인용입니다 .

형식의 단어는 $'string'특별히 취급됩니다. stringANSI C 표준에 지정된대로 백 슬래시 이스케이프 문자가 바뀌면서 단어가로 확장됩니다 .

따라서 $'\n'개행으로 대체됩니다.

이것은 관련이 매개 변수 확장 쉘 의 사용에도 불구하고 $.


6

같은 문자열 은 POSIX 표준에 $'\n'의해 도입되었으며 ksh93현재 POSIX 표준의 일부가 아닙니다.

예를 들어 C와 같은 대부분의 C 이스케이프 $'\u2345'와를 지원하는 이스케이프를 사용할 수 있습니다 echo.

(ksh93 또는 bash의 경우) 해당 이스케이프 메소드를 사용하지 않으려는 경우 여전히 다음을 사용할 수 있습니다.

IFS='
'

이는 동일하지만 읽기가 어렵습니다.

BTW :이 확장은 이미 POSIX 표준 커밋 을 통과했지만 2020 년 이전에는 나타나지 않을 것으로 예상되는 SUSv8 로 예정되어 있습니다. 현재 버그 목록 뒤의 지연에 대해 작업해야하기 때문입니다.


$'...'확장은 의 확장과 다릅니다 echo. 그것들은의 형식 인수에 대한 것과 비슷합니다 printf. 를 들어 echo0이 필요합니다, \0123를위한 동안 $'...'printf형식 \0123이 될 것입니다 \012줄 바꿈이 litteral 3. 다음
스테판 Chazelas가

1
합니다 $'...'사양은 아직 논의되고있다. 현재 제안 된 문구로 해결해야 할 몇 가지 문제가 있습니다.
Stéphane Chazelas

IIRC, 폐쇄되었지만 재개되었습니다. 그것이 효력을 발휘하기까지 여전히 많은 시간이 있다는 사실 때문에, 나는 그것에 관한 실제 문제를 보지 못한다.
schily

1
그것은 닫혀 있었고, 몇 가지 반대 의견을 제기했으며, 다시 열었고, 수정되었고, 여전히 몇 가지 문제 (대부분 \uxxxx확장 에 관한 문제 )가 있으며 기존 구현을 수용 할 수있는 해결책이 없습니다. 따라서 다음 POSIX 버전으로 만들지 못할 수 있습니다. 아마도 그들은 \uxxxxissue8에 대한 확장을 남길 수 있으므로 적어도 여전히 가질 수 있습니다 $'\n'.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.