bash에서 "$"는 무엇을 의미합니까?

bash에서 "$"는 무엇을 의미합니까?

문자의 ASCII 코드를 얻고 싶으므로 다음이 있습니다.

VAR="a"
NUM=$(printf "%d" "'$VAR")
echo $NUM

'$이 경우에는 무엇을 의미합니까? 구문을 이해하기 위해 누군가 나에게 문서를 알려줄 수 있습니까? $(...)또는 의 printf일부 인지 이해가 되지 않습니다 bash.

답변1

'$특별한 것은 없습니다. %din 을 사용할 때 printf인수를 정수 표현식으로 평가하려고 시도합니다. , 또는 정수 97 'a로 처리됩니다 . char a변수 확장 없이도 동일한 결과를 얻습니다.

$ printf %d\\n "'a'"
97
$ printf %d\\n "'0'"
48
$ printf %d\\n "'"$'\1'
1

~에서배쉬 문서printf(강조):

문자열이 아닌 형식 지정자에 대한 인수는 C 언어 상수로 처리되지만 앞에 더하기 또는 빼기 기호가 허용됩니다.선행 문자가 작은따옴표 또는 큰따옴표인 경우 값은 다음 문자의 ASCII 값입니다.

주석에서 언급했듯이 나머지 문자는 무시됩니다.

답변2

이는 'printf 매개변수의 일부입니다(매개변수 섹션 참조).여기).

$일반 쉘 확장의 일부이므로 인수  printf%d및 가 됩니다 'a.

마지막으로 $(...)다음과 같이 빌드합니다.명령 대체, 이 경우 NUM해당 값을 함수의 출력으로 설정하는 것을 의미합니다 printf.

답변3

이미 말했듯이 '$그 자체에는 특별한 의미가 없습니다. 귀하의 콘텐츠는 유틸리티 에 매개변수로 전달될 로 "'$VAR"확장됩니다 .'aprintf

이제 흥미로운 부분이 나옵니다. 즉, printf평범하지만 표준적인 기능(C의 함수가 아닌 쉘 유틸리티)입니다.

SuSv4에 따르면기준(강조):

인수 피연산자 [to printf]는 해당 변환 지정자가 , , 또는 이면 문자열로 처리되고, 해당 변환 지정자가 , , , , 이면 함수로 평가됩니다.bcsstrtod()aAeEfFgG

그렇지 않으면 [예를 들어 변환 지정자가 다음과 같은 경우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

관련 정보