Bash 정수 비교

Bash 정수 비교

bash 스타일 가이드를 읽는 동안 다음 가이드를 발견했습니다.

수학/정수 연산

((...))및 을 사용합니다 $((...)).

a=5
b=4

# wrong
if [[ $a -gt $b ]]; then
    ...
fi

# right
if ((a > b)); then
    ...
fi

[[내가 그들의 추론에 대해 물었을 때, 숫자를 앞에 오는 0과 비교하려고 하면 테스트가 질식할 수 있다는 말을 들었습니다 . 테스트에서는 문제를 재현할 수 없었습니다.

내 질문

((a > b))실제로 및 사이에 기능적 차이가 있습니까 [[ "$a" -gt "$b" ]]?

답변1

나는 그것을 볼 수 없다.

[[ val1 < val2 ]]그러나 와 사이에는 한 가지 차이점이 있습니다 (( val1 < val2 )). 전자는 문자열 비교입니다.

$ [[ 2 -lt 007 ]] && echo true || echo false
true
$ [[ 2 < 007 ]] && echo true || echo false
false
$ (( 2 < 007 )) && echo true || echo false
true

두 경우 모두 앞에 0이 여전히 문제가 되기는 하지만,

$ (( 20 < 021 )) && echo true || echo false
false
$ [[ 20 -lt 021 ]] && echo true || echo false
false

이는 C에서와 같이 8진수를 표시하기 때문입니다. 하지만 접두사를 붙여서 이런 일이 발생하는 것을 방지할 수 있습니다 10#. (Bash 참조 6.5 쉘 산술)

$ (( 10#20 < 10#021 )) && echo true || echo false
true

관련 정보