`echo $ ((0x63)) '이해하기


18

커맨드 라인을 통해 16 진수를 변환하는 방법을 찾고 있었고 매우 쉬운 방법이 있음을 발견했습니다 echo $((0x63)).

훌륭하게 작동하지만 여기서 일어나는 일에 대해 약간 혼란 스럽습니다.

나는 $(...)일반적으로 외부 명령 전에 내용이 평가되는 하위 쉘이라는 것을 알고 있습니다.

이 상황에서 여전히 하위 셸입니까? 나는 그것이 하위 쉘이 (0x63)명령이 아닌 평가 하는 것을 의미하지는 않을 것이라고 생각 합니다.

누군가 나를 위해 명령을 나눌 수 있습니까?

답변:


27

$(...)서브 쉘뿐만 아니라 명령 대체이지만 $((...))산술 확장입니다.

를 사용 $((...))하면 ...은 (는) 산술 표현식으로 해석됩니다. 이것은 무엇보다도 16 진 문자열이 숫자로 해석되어 10 진수로 변환됨을 의미합니다. 그러면 전체 표현식이 표현식이 평가하는 숫자 값으로 대체됩니다.

매개 변수 확장 및 명령 대체와 마찬가지로 $((...))셸의 단어 분할 및 파일 이름 globbing의 영향을받지 않도록 인용해야합니다.

echo "$(( 0x63 ))"

참고로 산술 연산 식에서 발생하는 변수는 다음과 같은 것이 필요하지 않습니다 $.

$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78

2
또한 $((...))명령 대체와 충돌 하기 때문에 echo "$( (echo x; echo y) | tr xy yx)"대신 쓰기를 기억해야합니다 echo "$((echo x; echo y) | tr xy yx)"(일부 쉘은 여전히 ​​YMMV를 허용하지만).
Stéphane Chazelas

@ StéphaneChazelas 그리고 어떻게 $(( ))단어 분리 또는 글 로빙의 영향을받는 출력물을 만들 수 있습니까?
Hauke ​​Laging 17

3
@HaukeLaging, IFS=9; echo $((0x63)). 참조 bash는 변수를 인용 잊어의 보안 의미를 / POSIX 쉘 ( What about [ $# -gt 1 ]섹션)
스테판 Chazelas가

3

이것은 서브 쉘이 아니라 산술 평가입니다. 보낸 사람 man bash:

((표현))

식은 아래의 산술 평가에 설명 된 규칙에 따라 평가 됩니다. 표현식의 값이 0이 아닌 경우 리턴 상태는 0입니다. 그렇지 않으면 리턴 상태는 1입니다. 이것은 "표현식"과 정확히 같습니다.


9
((...))와 동일하지 않습니다 $((...)). 둘 다 산술 평가를 수행하지만 후자는 문자열로 결과 값으로 대체됩니다.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.