Причина использования ksh -eq


8

Последняя версия 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 ((...))

Ответы:


8

Если вы делаете

$ 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.