IFS
개행 설정 앞에는 $가 붙어야 한다는 것을 알았습니다.
IFS=$'\n'
하지만 콜론을 설정하면
IFS=:
\n
변수 인가요 ?
답변1
이것은 매개변수 확장이 $'...'
아니며 해당 , , 코드를 개행 문자로 확장하는 bash
특수 인용문입니다 . 해당 유니코드 코드 포인트가 있는 문자에 대해서는 / 도 추가되었습니다 . 그리고 그것은 한동안이었습니다. 또한 다음과 같은 것을 지원합니다.ksh93
\n
\x0a
\12
zsh
\u000a
\U0000000a
ksh93
bash
\cj
zsh
\C-J
ksh93
\x{a}
이는 $
어떤 형태나 확장임을 암시하는 것입니다. 그러나 어쨌든 큰따옴표나 이 문서 내에서 수행되지 않으며(POSIX에 따라 지정되지는 않지만 모든 쉘에서 출력 ) 확장이 분할되지 않는다는 점에서 $
(예: $((1 + 1))
, $param
또는 ) 를 사용하는 다른 형태의 확장과 다릅니다. +glob, 스프레드 연산자보다 참조 연산자에 더 가깝습니다.$(cmd)
echo "$'x'"
$'x'
IFS=\n
n
IFS는 ( \
참조 연산자로 처리됨) 로 설정되거나 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
예를 들어 일부 도구나 printf
Python의 일부 구현도 자체적으로 확장될 수 있습니다. 예를 들어 다음과 같이 할 수 있습니다.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
or 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$
( 0x5c
ASCII의 바이트 값입니다 \
. 0x1 바이트를 구분 기호로 사용하여 이 배열 변수를 인코딩하는 방법도 참조하세요.)
답변2
이것은ANSI-C 인용문:
이 형태의 단어는
$'string'
특별히 처리됩니다. 단어는string
ANSI C 표준에 지정된 대로 대체된 백슬래시 이스케이프 문자를 사용하여 확장됩니다.
따라서 $'\n'
개행 문자로 대체됩니다.
이것은 아무 관련이 없습니다쉘 매개변수 확장, 자유롭게 사용하세요 $
.
답변3
이와 같은 문자열은 $'\n'
POSIX 표준에 의해 도입되었지만 ksh93
현재 POSIX 표준의 일부는 아닙니다.
$'\u2345'
에서 지원하는 이스케이프 문자와 같은 대부분의 C와 유사한 이스케이프 문자를 사용할 수 있습니다 echo
.
이 이스케이프 방법을 사용하고 싶지 않은 경우(ksh93 또는 bash의 경우) 다음을 계속 사용할 수 있습니다.
IFS='
'
이는 동일하지만 읽기가 더 어렵습니다.
참고: 이 확장은 POSIX 표준 위원회의 승인을 받았지만 다음에 계획되어 있습니다.SUSv8현재 버그 목록 뒤에 있는 문제를 먼저 해결해야 하므로 2020년 이전에는 이런 일이 발생하지 않을 것으로 예상됩니다.