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
에서도 사용 가능하며 배열로 인쇄도 지원함).zsh
print
printf
print -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개의 베이스 zsh
와 mksh
최대 36개의 베이스를 지원합니다.
ksh93의 printf
내장 함수는 n#
접두사가 있거나 없는 모든 기본 숫자 출력을 지원합니다.
$ printf '%..2d\n' 0x1FE
111111110
$ printf '%#..2d\n' 0x1FE
2#111111110
ksh93에서는 var=$(printf...)
하위 쉘이 분기되지 않으므로 bash
s만큼 효율적입니다 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진수로 변환"