최신 버전의 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