대시 테스트에서 16진수 숫자가 포함된 두 문자열(하나는 앞에 0이 있고 다른 하나는 앞에 0이 없음)을 비교하려고 합니다.
hex_string_1: 0x02a0000b
hex_string_2: 0x2a0000b
시도 if [ ${hex_string_1} -eq ${hex_string_2} ] ; then ...
(또는 그 반대의 경우 앞에 0이 중요하지 않은 것 같음)하면 다음과 같은 오류가 발생했습니다.
[: Illegal number: 0x02a0000b
sed
예를 들어 문자열 형식을 다시 지정하는 대신 숫자로 비교하는 쉬운 방법이 있습니까 ?
dash
대신 사용하고 있으므로 bash
이는 [[
옵션이 아닙니다.
업데이트: 작동합니다(Ott에게 감사드립니다!):
[ $(printf "%d" ${hex_string_1}) -eq $(printf "%d" ${hex_string_2}) ]
답변1
POSIX적으로:
[ "$((hex_string_1))" -eq "$((hex_string_2))" ]
이전 버전을 사용하려면 다음 dash
을 수행해야 합니다.
[ "$(($hex_string_1))" -eq "$(($hex_string_2))" ]
POSIX적으로는 다음과 같습니다.
[ "$hex_string_1" -eq "$hex_string_2" ]
이것[
유틸리티 test
에 대한 POSIX 사양피연산자는 정수여야 한다고 나와 있지만 지원되는 정수 형식(10진수, 8진수, 16진수...)은 지정하지 않지만 실제로는 6번 항목에서 다룹니다.유틸리티 매개변수 구문지정되지 않은 경우 기본값을 지정합니다.
6. 달리 명시하지 않는 한, 피연산자 또는 옵션 인수가 숫자 값이거나 숫자 값을 포함할 때마다:
- 숫자는 10진수로 해석됩니다.
- 0~2147483647 범위의 숫자는 구문상 숫자 값으로 인식됩니다.
- 유틸리티 설명에 피연산자 또는 옵션 인수로 음수를 허용한다고 명시되어 있는 경우 -2147483647에서 2147483647 범위의 숫자는 구문상 숫자 값으로 인식됩니다.
- 허용되는 범위는 여기에 나열된 범위보다 큽니다.
실제로 AT&T에서는 ( ] [ 0x10 -eq 16 ]
만 유효합니다 (하지만 으로 간주되어 true를 반환하기 때문에 ) .posh
[ 0x1 -eq 0x01
ksh
0
[ 0x2 -eq 0x123 ]
posh
허점), 모든 [
구현은 false를 반환합니다 [ 010 -eq 8 ]
(예: 010
8진수가 아닌 10진수로 처리됨).
에서는 ksh93
할 수 없지만 [ 0x10 -eq 16 ]
할 수 있습니다 [ +0x10 -eq 16 ]
(그리고 사용할 수도 있습니다 posh
). AT&T ksh
및 pdksh
파생 상품(포함 ) posh
에서도 동일한 작업을 수행할 수 있습니다 [ '16#10' -eq 16 ]
.
답변2
언제든지 printf
십진수로 변환하고 @ott-- 제안된 방식으로 비교할 수 있습니다.
[ $(printf "%d" "$hex_string_1") -eq $(printf "%d" "$hex_string_2") ] && echo y
또는
if [ $(printf "%d" "$hex_string_1") -eq $(printf "%d" "$hex_string_2") ]
then
echo y
fi