Grund für ksh obsolet -eq

8

Die neueste Version von ksh veraltet die Verwendung -eqinnerhalb von [[ ]]Blöcken und bevorzugt (( ))stattdessen. Warum ist das? Ich kann nirgendwo eine Dokumentation über die Vorteile von (( ))over [[ ]]finden, und ich finde diese Syntax wesentlich offensichtlicher.

Zum Beispiel:

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

gibt

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

Antworten:

8

Wenn Sie tun

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

Sie erhalten die Nachricht

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

wie du gesehen hast. Versuchen Sie nun Folgendes:

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

Das funktioniert:

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

Denken Sie daran, dass die erste Nachricht nur eine Warnung ist. Sie können dieses Formular weiterhin verwenden. Ich bezweifle, dass es entfernt wird, da es zu viele vorhandene Skripte beschädigen würde. Dies wird übrigens ohne Vorwarnung akzeptiert:

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

Einer der Hauptgründe , dass doppelte Klammern bevorzugt wird , ist , dass die Vergleichsoperatoren die besser vertraut sind <, <=, ==usw., (zumindest , wenn Vergleich zu anderen Sprachen).

Doppelte Klammern funktionieren auch in Bash und zsh. Eine verwandte Form, die arithmetische Substitution, funktioniert in allen und wird von POSIX angegeben.

$ a=$((3 * 4))

Korn, Bash und Z können das auch so machen:

$ (( a = 3 * 4 ))

Obwohl Dash als Beispiel für eine POSIX-Shell keine Vergleiche in doppelten Klammern im Formular unterstützt if (( ... )), können Sie diese dennoch mit arithmetischer Substitution durchführen. Das Ergebnis ist jedoch das Gegenteil von dem, was Sie erwarten würden (dies gilt auch für die Anderen).

$ 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
Bis auf weiteres angehalten.
quelle