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