Bash에서 진수를 십진수로 변환하는 방법도착하다또 다른 기본, 특히 16진수입니다. 다른 방향으로 가는 것이 쉬운 것 같습니다.
$ echo $((16#55))
85
웹을 검색하면서 수학 및 문자 조작을 수행하여 함수로 사용할 수 있는 변환을 수행하는 스크립트를 찾았지만 bash에는 이미 기수 변환이 내장되어 있는 것 같습니다. 이것이 가능합니까?
답변1
bash
(또는 해당 printf
명령을 사용할 수 있는 경우 임의의 쉘(일반적으로 쉘에 내장된 표준 POSIX 명령))을 사용하십시오 .
printf '%x\n' 85
를 사용하면 zsh
다음 작업도 수행할 수 있습니다.
dec=85
hex=$(([##16]dec))
이는 2에서 36까지의 기본 숫자에 적용됩니다( 0-9a-z
숫자는 대소문자를 구분하지 않습니다).
$(([#16]dev))
옵션이 활성화되면 (하나만 ) 또는 (기본 16의 특별한 경우로) #
로 확장됩니다 ( 기본 8에도 적용됩니다( 옵션도 활성화된 경우 대신 )).16#55
0x55
cbases
0125
8#125
octalzeroes
Pass 다음을 ksh93
사용할 수 있습니다.
dec=85
base54=${ printf %..54 "$dec"; }
2~64진수에 적용됩니다( 0-9a-zA-Z@_
숫자와 동일).
및 ksh
에는 zsh
다음도 있습니다.
$ typeset -i34 x=123; echo "$x"
34#3l
ksh88, zsh 및 pdksh에는 최대 36개 베이스가 있는 반면, ksh93에는 최대 64개 베이스가 있습니다.
long
이 모든 것은 시스템의 정수 크기로 제한됩니다( int
일부 쉘의 경우). 더 큰 일에는 bc
또는 를 사용할 수 있습니다 dc
.
$ echo 'obase=16; 9999999999999999999999' | bc
21E19E0C9BAB23FFFFF
$ echo '16o 9999999999999999999999 p' | dc
21E19E0C9BAB23FFFFF
지원되는 기본 범위는 2개부터 POSIX에서 요구하는 최소 99개까지입니다. 16보다 큰 진수의 경우 9보다 큰 숫자는 공백으로 구분된 0으로 채워진 십진수로 표시됩니다.
$ echo 'obase=30; 123456' | bc
04 17 05 06
dc
또는 ( bc
일부 시스템에서는 여전히 래퍼인 ) 과 동일합니다 dc
.
$ echo 30o123456p | dc
04 17 05 06
답변2
printf를 사용하세요:
$ printf "%d %x\n" $((16#55)) $((10#85))
85 55
변수에 값을 할당하려면 명령 대체를 사용하십시오.
$ x=$( printf "%x" 85 ) ; echo $x
55
답변3
모든 POSIX 호환 셸에 있는 내장 산술 확장을 사용하여 교체하세요. 이는 요즘 거의 보편적입니다.
$ echo $((0xbc))
188
그리고
$ hex=dead
$ dec=$((0x$hex))
$ echo $dec
57005
참고: 특히 마지막 예에서 확장하면 예상치 못한 결과가 발생할 수 있습니다. 변수 "hex"의 16진수는 적법한 16진수 상수를 형성해야 하며, 그렇지 않으면 모호한 오류 메시지가 발생할 수 있습니다. 예를 들어 "hex"가 "0xdead"인 경우 산술 확장은 0x0xdead가 되며 이는 상수로 해석될 수 없습니다. 물론, 이 경우 산술 확장 $(($hex)) 이 트릭을 수행합니다. 독자는 선택적 "0x" 접두사를 제거하기 위해 간단한 하위 문자열 처리 패턴 일치를 만드는 연습으로 남겨 둡니다.
답변4
awk를 사용할 수 있습니다.벨벳 도서관:
$ velour -n 'print n_baseconv(15, 10, 16)'
F
또는:
$ velour -n 'print n_baseconv(ARGV[1], 10, 16)' 15
F