방금 init 스크립트에서 이것을 보았습니다.
echo $"Stopping Apache"
그 달러 기호는 무엇에 사용되나요?
지금까지 나의 연구:
Bash 매뉴얼에서 이것을 찾았습니다.
바깥쪽 따옴표
설정된 경우
$'string'
큰따옴표로 묶인 확장$"string"
내에서 인용이 수행됩니다 .${parameter}
이 옵션은 기본적으로 활성화되어 있습니다.
...하지만 접두사가 있는 문자열과 접두사가 없는 문자열 사이에는 차이가 없습니다 $
.
$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in $PWD'
I am in $PWD
답변1
여기서는 두 가지 다른 일이 발생하며 둘 다 bash
매뉴얼 에 문서화되어 있습니다.
$'
달러 기호 작은따옴표는 특별한 형태의 인용입니다.
$'string' 형식의 단어는 특별하게 처리됩니다. 단어는 ANSI C 표준에 지정된 대로 대체된 백슬래시 이스케이프 문자를 사용하여 문자열로 확장됩니다.
$”
현지화에는 달러 기호 큰따옴표가 사용됩니다.
달러 기호('$') 앞에 큰따옴표가 붙은 문자열을 사용하면 해당 문자열이 현재 로케일에 따라 번역됩니다. 현재 로케일이 C 또는 POSIX인 경우 달러 기호는 무시됩니다. 문자열이 번역되어 바뀌면 대체 내용이 큰따옴표로 묶입니다.
답변2
이스케이프 시퀀스는 문자열이 내부적으로 확장될 때 $''
해석됩니다 . 맨페이지에서:
Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by the
ANSI C standard.
간단한 예는 줄 바꿈에 대한 \n 이스케이프 시퀀스입니다.
$ echo 'foo\n'
foo\n
$ echo $'foo\n'
foo
$
echo
참고: 다른 셸에서는 제공된 옵션 없이 이스케이프 시퀀스가 해석될 수 있으므로 다른 결과를 얻을 수 있습니다 .
답변3
매뉴얼을 잘못 이해하셨어요. $quoted 문자열을 사용하는 경우에만 효과를 볼 수 있습니다.~에확장 ${parameter}
.
$ echo "${v:-'ab\ncd'}"
'ab\ncd'
$ echo "${v:-$'ab\ncd'}"
ab
cd
출처 및 추가 자료:https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html