Если вы делаете
$ 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 ))
Хотя Dash, как пример оболочки POSIX, не поддерживает сравнения в круглых скобках в форме 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