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