Si lo haces
$ ksh -n 'if [[ 1 -eq 1 ]]; then echo hi; fi'
recibes el mensaje
ksh: warning: line 1: -eq within [[...]] obsolete, use ((...))
como has visto Ahora intenta esto:
$ ksh -n 'if (( 1 -eq 1 )); then echo hi; fi'
ksh: 1 -eq 1 : arithmetic syntax error
Esto funciona:
$ ksh -n 'if (( 1 == 1 )); then echo hi; fi'
Recuerde que el primer mensaje es solo una advertencia. Puedes seguir usando ese formulario. Dudo que se elimine ya que rompería demasiados scripts existentes. Por cierto, esto se acepta sin previo aviso:
$ ksh -n 'if [ 1 -eq 1 ]; then echo hi; fi'
Una de las principales razones se prefiere que paréntesis dobles es que los operadores de comparación son los más familiar <
, <=
, ==
, etc., (por lo menos en comparación con otros idiomas).
Los paréntesis dobles también funcionan en Bash y zsh. Una forma relacionada, la sustitución aritmética, funciona en todos ellos, además de que está especificada por POSIX.
$ a=$((3 * 4))
Korn, Bash y Z también pueden hacerlo de esta manera:
$ (( a = 3 * 4 ))
A pesar de que Dash, como ejemplo de un shell POSIX, no admite comparaciones de paréntesis dobles en el formulario if (( ... ))
, aún puede hacerlo utilizando la sustitución aritmética, pero el resultado es lo contrario de lo que cabría esperar (esto también es cierto para los demás).
$ 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