문자의 ASCII 코드를 얻고 싶으므로 다음이 있습니다.
VAR="a"
NUM=$(printf "%d" "'$VAR")
echo $NUM
'$
이 경우에는 무엇을 의미합니까? 구문을 이해하기 위해 누군가 나에게 문서를 알려줄 수 있습니까? $(...)
또는 의 printf
일부 인지 이해가 되지 않습니다 bash
.
답변1
'$
특별한 것은 없습니다. %d
in 을 사용할 때 printf
인수를 정수 표현식으로 평가하려고 시도합니다. , 또는 정수 97 'a
로 처리됩니다 . char
a
변수 확장 없이도 동일한 결과를 얻습니다.
$ printf %d\\n "'a'"
97
$ printf %d\\n "'0'"
48
$ printf %d\\n "'"$'\1'
1
~에서배쉬 문서printf
(강조):
문자열이 아닌 형식 지정자에 대한 인수는 C 언어 상수로 처리되지만 앞에 더하기 또는 빼기 기호가 허용됩니다.선행 문자가 작은따옴표 또는 큰따옴표인 경우 값은 다음 문자의 ASCII 값입니다.
주석에서 언급했듯이 나머지 문자는 무시됩니다.
답변2
답변3
이미 말했듯이 '$
그 자체에는 특별한 의미가 없습니다. 귀하의 콘텐츠는 유틸리티 에 매개변수로 전달될 로 "'$VAR"
확장됩니다 .'a
printf
이제 흥미로운 부분이 나옵니다. 즉, printf
평범하지만 표준적인 기능(C의 함수가 아닌 쉘 유틸리티)입니다.
SuSv4에 따르면기준(강조):
인수 피연산자 [to
printf
]는 해당 변환 지정자가 , , 또는 이면 문자열로 처리되고, 해당 변환 지정자가 , , , , 이면 함수로 평가됩니다.b
c
s
strtod()
a
A
e
E
f
F
g
G
그렇지 않으면 [예를 들어 변환 지정자가 다음과 같은 경우
d
], ISO C 표준에 설명된 대로 다음 확장을 사용하여 접미사가 없는 C 정수 상수로 평가됩니다.
선도
<plus-sign>
하거나 허용됩니다.<hyphen-minus>
만약 주인공이작은따옴표 또는 큰따옴표, 값은 숫자여야 합니다.기본 코드 세트에서다음 문자작은따옴표 또는 큰따옴표.
- 접미사가 붙은 정수 상수가 허용됩니다.
쉘이 멀티바이트 문자를 지원하는 경우(현대 시스템의 기본값인 UTF-8과 같이) 숫자 값은 선행 바이트가 아닌 전체 문자의 값이 됩니다.
% printf '%d\n' '"á' "'é"
225
233
% printf 'U+%X\n' '"猫儿'
U+732B
이는 문자의 "ASCII 값"이 아닙니다.설명하다bash 맨페이지는 기껏해야 오해의 소지가 있기 때문입니다.
f
그러나 bash(및 yash를 제외한 대부분의 다른 쉘)는 or 와 같은 부동 소수점 지정자를 사용할 때에도 해당 변환을 수행하기 때문에 호환되지 않습니다. 이는 위의 첫 번째 단락을 명백히 위반하는 것이며, 이 경우에 사용해야 한다고 g
말합니다 :strtod()
% bash --posix -c 'printf "%f\n" \"Q'
81.000000