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

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

IFS개행 설정 앞에는 $가 붙어야 한다는 것을 알았습니다.

IFS=$'\n'

하지만 콜론을 설정하면

IFS=:

\n변수 인가요 ?

답변1

이것은 매개변수 확장이 $'...'아니며 해당 , , 코드를 개행 문자로 확장하는 bash특수 인용문입니다 . 해당 유니코드 코드 포인트가 있는 문자에 대해서는 / 도 추가되었습니다 . 그리고 그것은 한동안이었습니다. 또한 다음과 같은 것을 지원합니다.ksh93\n\x0a\12zsh\u000a\U0000000aksh93bash\cjzsh\C-Jksh93\x{a}

이는 $어떤 형태나 확장임을 암시하는 것입니다. 그러나 어쨌든 큰따옴표나 이 문서 내에서 수행되지 않으며(POSIX에 따라 지정되지는 않지만 모든 쉘에서 출력 ) 확장이 분할되지 않는다는 점에서 $(예: $((1 + 1)), $param또는 ) 를 사용하는 다른 형태의 확장과 다릅니다. +glob, 스프레드 연산자보다 참조 연산자에 더 가깝습니다.$(cmd)echo "$'x'"$'x'

IFS=\nnIFS는 ( \참조 연산자로 처리됨) 로 설정되거나 IFS="\n"IFS IFS='\n'는 백슬래시와 2문자로 설정됩니다 n.

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

IFS='
'

또는

IFS="
"

또는

IFS=$'
'

set list리터럴 줄 바꿈을 전달하려면 덜 명확하지만(사람들은 코드에 다른 공백 문자가 있는지 여부와 같은 것을 사용하는 것 외에는 vi볼 수 없습니다 ).$IFS

IFS=:, IFS=':', IFS=":", IFS=$':'모두 IFS를 로 설정하므로 :어느 것을 사용하든 상관없습니다.

$'...'최소한 다음(변종 포함)에서 지원됩니다: ksh93, zsh, bash, mksh, busybox sh, FreeBSD sh. ksh93그리고 텍스트 현지화를 위한 인용 형식 bash도 있지만 $"..."이식성과 신뢰성을 위해 배포하고 사용하는 것이 번거로워 거의 사용되지 않습니다.

그리고 es쉘은 외부에서 따옴표를 사용하여 개행 문자로 확장할 fish수도 있습니다 .\n

예를 들어 일부 도구나 printfPython의 일부 구현도 자체적으로 확장될 수 있습니다. 예를 들어 다음과 같이 할 수 있습니다.echoawk\n

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

줄 바꿈이 출력되지만 다음 사항에 유의하세요.

IFS=$(printf '\n')

$(...)명령 대체( )가 모든 후행 줄 바꿈을 제거하기 때문에 작동하지 않습니다 . 하지만 다음을 사용할 수 있습니다.

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

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

이제 완전성을 위해 rc셸 및 파생 항목(예: esor akanga) 에서는 실제로 해당 변수( 이름이 두 문자의 합계 시퀀스인 변수) $'\n'의 확장입니다 . \n이러한 셸에는 변수 이름에 포함될 수 있는 문자에 대한 제한이 없으며 따옴표 유형은 .\n'...'

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

rc변수는 모두 환경으로 내보내지지만 적어도 Unix 변형에서는 rc다음과 같은 변수 이름의 경우 \n환경 변수 버전이 어떤 형식으로 인코딩됩니다.

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

( 0x5cASCII의 바이트 값입니다 \. 0x1 바이트를 구분 기호로 사용하여 이 배열 변수를 인코딩하는 방법도 참조하세요.)

답변2

이것은ANSI-C 인용문:

이 형태의 단어는 $'string'특별히 처리됩니다. 단어는 stringANSI C 표준에 지정된 대로 대체된 백슬래시 이스케이프 문자를 사용하여 확장됩니다.

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

이것은 아무 관련이 없습니다쉘 매개변수 확장, 자유롭게 사용하세요 $.

답변3

이와 같은 문자열은 $'\n'POSIX 표준에 의해 도입되었지만 ksh93현재 POSIX 표준의 일부는 아닙니다.

$'\u2345'에서 지원하는 이스케이프 문자와 같은 대부분의 C와 유사한 이스케이프 문자를 사용할 수 있습니다 echo.

이 이스케이프 방법을 사용하고 싶지 않은 경우(ksh93 또는 bash의 경우) 다음을 계속 사용할 수 있습니다.

IFS='
'

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

참고: 이 확장은 POSIX 표준 위원회의 승인을 받았지만 다음에 계획되어 있습니다.SUSv8현재 버그 목록 뒤에 있는 문제를 먼저 해결해야 하므로 2020년 이전에는 이런 일이 발생하지 않을 것으로 예상됩니다.

관련 정보