답변:
$(...)서브 쉘뿐만 아니라 명령 대체이지만 $((...))산술 확장입니다.
를 사용 $((...))하면 ...은 (는) 산술 표현식으로 해석됩니다. 이것은 무엇보다도 16 진 문자열이 숫자로 해석되어 10 진수로 변환됨을 의미합니다. 그러면 전체 표현식이 표현식이 평가하는 숫자 값으로 대체됩니다.
매개 변수 확장 및 명령 대체와 마찬가지로 $((...))셸의 단어 분할 및 파일 이름 globbing의 영향을받지 않도록 인용해야합니다.
echo "$(( 0x63 ))"
참고로 산술 연산 식에서 발생하는 변수는 다음과 같은 것이 필요하지 않습니다 $.
$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78
$(( ))단어 분리 또는 글 로빙의 영향을받는 출력물을 만들 수 있습니까?
IFS=9; echo $((0x63)). 참조 bash는 변수를 인용 잊어의 보안 의미를 / POSIX 쉘 ( What about [ $# -gt 1 ]섹션)
이것은 서브 쉘이 아니라 산술 평가입니다. 보낸 사람 man bash:
((표현))
식은 아래의 산술 평가에 설명 된 규칙에 따라 평가 됩니다. 표현식의 값이 0이 아닌 경우 리턴 상태는 0입니다. 그렇지 않으면 리턴 상태는 1입니다. 이것은 "표현식"과 정확히 같습니다.
((...))와 동일하지 않습니다 $((...)). 둘 다 산술 평가를 수행하지만 후자는 문자열로 결과 값으로 대체됩니다.
$((...))명령 대체와 충돌 하기 때문에echo "$( (echo x; echo y) | tr xy yx)"대신 쓰기를 기억해야합니다echo "$((echo x; echo y) | tr xy yx)"(일부 쉘은 여전히 YMMV를 허용하지만).