저는 명령줄을 통해 16진수를 변환하는 방법을 찾고 있었는데 매우 쉬운 방법이 있다는 것을 알게 되었습니다 echo $((0x63))
.
잘 작동하지만 여기서 무슨 일이 일어나고 있는지 조금 혼란 스럽습니다.
나는 그것이 $(...)
일반적으로 외부 명령 전에 내용이 평가되는 하위 쉘이라는 것을 알고 있습니다.
이 경우에도 여전히 서브쉘인가요? 나는 그렇지 않다고 생각합니다. 왜냐하면 그것은 서브쉘이 (0x63)
어떤 것이 명령이 아닌지 평가한다는 것을 의미하기 때문입니다.
누군가 이 명령을 분석하는 데 도움을 줄 수 있나요?
답변1
$(...)
명령 대체(서브쉘뿐만 아니라)이자 $((...))
산술 확장이기도 합니다.
사용하면 $((...))
산술 ...
식으로 해석됩니다. 이는 무엇보다도 16진수 문자열이 숫자로 해석되어 10진수로 변환된다는 것을 의미합니다. 그런 다음 전체 표현식은 표현식이 평가되는 숫자 값으로 대체됩니다.
매개변수 확장 및 명령 대체와 마찬가지로 $((...))
쉘의 단어 분리 및 파일 이름 글로빙의 영향을 받지 않도록 따옴표로 묶어야 합니다.
echo "$(( 0x63 ))"
참고로 산술 표현식에 나타나는 변수에는 필요하지 않습니다 $
.
$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78
답변2
이것은 서브쉘이 아니라 산술 평가입니다. ~에서man bash
:
((표현하다))
표현식은 아래 설명된 규칙에 따라 평가됩니다.산술 평가. 표현식이 0이 아닌 것으로 평가되면 반환 상태는 0이고, 그렇지 않으면 반환 상태는 1입니다. 이는 let "expression"과 완전히 동일합니다.