ksh가 -eq를 더 이상 사용하지 않는 이유

ksh가 -eq를 더 이상 사용하지 않는 이유

최신 버전의 ksh는 블록 -eq내 사용을 더 이상 사용하지 않고 대신 선호합니다. 왜 이런거야? 그 장점 에 대한 문서를 찾을 수 없으며 구문이 더 분명하다는 것을 알았습니다.[[ ]](( ))(( ))[[ ]]

예를 들어:

#!/bin/ksh
var=1
if [[ $var -eq 1 ]]
then
  echo ALPHA
fi

주어진

[adam@hendrix test]$ ksh -n test.sh
test.sh: warning: line 3: -eq within [[...]] obsolete, use ((...))

답변1

당신이 그렇게한다면

$ ksh -n 'if [[ 1 -eq 1 ]]; then echo hi; fi'

너 메시지 받았어

ksh: warning: line 1: -eq within [[...]] obsolete, use ((...))

당신이 본 것처럼. 이제 이것을 시도해 보세요:

$ ksh -n 'if (( 1 -eq 1 )); then echo hi; fi'
ksh:  1 -eq 1 : arithmetic syntax error

이것은 작동합니다:

$ ksh -n 'if (( 1 == 1 )); then echo hi; fi'

첫 번째 메시지는 단지 경고일 뿐이라는 점을 기억하세요. 이 양식을 계속 사용할 수 있습니다. 기존 스크립트가 너무 많이 손상되므로 제거될 것 같지 않습니다. 그런데, 이것은 경고 없이 받아들여집니다:

$ ksh -n 'if [ 1 -eq 1 ]; then echo hi; fi'

중 하나주된 이유비교 연산자가 <, <=, ==등(적어도 다른 언어에 비해) 더 친숙하기 때문에 이중 괄호가 선호됩니다.

이중 괄호는 Bash 및 zsh에서도 작동합니다. 관련 형식인 산술 대체는 이러한 모든 형식에 적용되며 POSIX에 의해 지정됩니다.

$ a=$((3 * 4))

Korn, Bash 및 Z도 다음을 수행할 수 있습니다.

$ (( a = 3 * 4 ))

POSIX 셸의 예인 Dash는 공식적인 이중 대괄호 비교를 지원하지 않지만 if (( ... ))여전히 산술 대체를 사용하여 비교를 수행할 수 있지만 결과는 (다른 경우에 대해) 기대하는 것과 반대가 됩니다.

$ echo $(( 1 == 1 )); (( 1 == 1 )); echo $?    # in Dash, use true instead of the second statement
1
0
$ echo $(( 1 == 2 )); (( 1 == 2 )); echo $?    # in Dash, use false instead of the second statement
0
1

관련 정보