Raison de l'obsolescence de ksh -eq

8

La dernière version de ksh est obsolète en utilisant -eqdans les [[ ]]blocs, préférant à la (( ))place. Pourquoi est-ce? Je ne peux pas trouver de la documentation sur les avantages de (( ))plus [[ ]]partout, et je trouve que la syntaxe beaucoup plus évidente.

Par exemple:

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

donne

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

Réponses:

8

Si tu fais

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

vous obtenez le message

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

comme vous l'avez vu. Maintenant, essayez ceci:

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

Cela marche:

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

N'oubliez pas que le premier message n'est qu'un avertissement. Vous pouvez continuer à utiliser ce formulaire. Je doute qu'il sera supprimé car il casserait trop de scripts existants. Soit dit en passant, cela est accepté sans avertissement:

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

L' une des principales raisons qui doublent entre parenthèses préféré est que les opérateurs de comparaison sont les plus familiers <, <=, ==, etc., (au moins par rapport aux autres langues).

Les parenthèses doubles fonctionnent également dans Bash et zsh. Une forme connexe, la sous-station arithmétique, fonctionne dans chacun d'eux, plus elle est spécifiée par POSIX.

$ a=$((3 * 4))

Korn, Bash et Z peuvent également procéder de cette façon:

$ (( a = 3 * 4 ))

Même si Dash, comme exemple de shell POSIX, ne prend pas en charge les comparaisons entre parenthèses doubles dans le formulaire if (( ... )), vous pouvez toujours les faire en utilisant la substitution arithmétique, mais le résultat est le contraire de ce que vous attendez (cela est également vrai pour les autres).

$ 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
En pause jusqu'à nouvel ordre.
la source