Bash 스크립트에 두 개의 16진수 숫자를 추가하는 방법

Bash 스크립트에 두 개의 16진수 숫자를 추가하는 방법

Bash 스크립트에 두 개의 16진수 변수를 추가하고 싶습니다. 10진수가 아닌 16진수로 시작하고 끝나기를 바랍니다.

지금까지 제가 생각해낸 것은 해킹에 관한 것입니다. 더 좋고 더 우아한 솔루션이 있습니까?

BASE=0xA000

OFFSET=0x1000

NEW_BASE=$(( $BASE + $OFFSET ))

NEW_BASE=`printf "0x%X\n" $NEW_BASE`

echo $NEW_BASE

0xB000

답변1

스크립트를 다음과 같이 단순화하겠습니다.

printf "0x%X\n" $((0xA000 + 0x1000))

답변2

bash예, in은 printf숫자의 형식을 다른 진수로 다시 지정하는 유일한 기본 제공 방법이며 8, 10, 16진수만 지원됩니다.

bash( ksh93또는 같은 쉘과 반대로 ) 에서 fish명령 대체를 사용한다는 것은 서브쉘을 분기하는 것을 의미합니다. 여기에서 서브셸 사용을 방지 할 수 있습니다 (최신 버전의 for 및 ( ) printf -v에서도 사용 가능하며 배열로 인쇄도 지원함).zshprintprintfprint -f

printf -v NEWBASE '%#X' "$((BASE + OFFSET))"

(In bash과 달리 는 zsh분사 $((...))의 영향을 받기 때문에 에 의존하지 않으려면 인용해야 합니다 $IFS.)

에서는 zsh산술 확장 구문(진수 2~36)의 일부로 확장된 기수를 지정할 수 있습니다.

$ echo $(([#16] 0xff + 0xff))
16#1FE
$ echo $(([##16] 0xff + 0xff))
1FE
$ echo 0x$(([##16] 0xff + 0xff))
0x1FE
$ echo $(([##2] 0xff + 0xff))
111111110

ksh 및 zsh를 사용하면 다음을 사용하여 정수 변수를 특정 기준으로 확장하도록 강제할 수도 있습니다.

typeset -i 16 NEWBASE

확장은 다음 16#1FE형식을 취합니다. ksh93은 최대 64개의 베이스 zshmksh최대 36개의 베이스를 지원합니다.

ksh93의 printf 내장 함수는 n#접두사가 있거나 없는 모든 기본 숫자 출력을 지원합니다.

$ printf '%..2d\n' 0x1FE
111111110
$ printf '%#..2d\n' 0x1FE
2#111111110

ksh93에서는 var=$(printf...)하위 쉘이 분기되지 않으므로 bashs만큼 효율적입니다 printf -v.

답변3

GNU나 최신 BSD에서는 dc다음과 같이 할 수 있습니다:

echo A000 1000 | dc -e '16o16i?+p'

16o출력 베이스를 설정합니다. 16i입력 베이스를 설정합니다. 표준 입력에서 한 줄을 읽습니다 ?. 이 경우 두 개의 숫자를 스택에 푸시합니다. +그들은 덧붙였다. p스택의 맨 위(답)를 인쇄합니다.

답변4

합계의 합계는 다음 $hexNumA과 같습니다 $hexNumB.

printf "%x\n" $((16#$hexNumA + 16#$hexNumB))

16진수에 10진수를 쉽게 추가할 수도 있습니다.

printf "%x\n" $((16#$hexNum + $decNum))

예의 바른: "Bash에서 16진수를 10진수로 변환"

관련 정보