Motivo de ksh obsoleto -eq

8

La última versión de ksh está obsoleta usando -eqdentro de [[ ]]bloques, prefiriendo (( ))en su lugar. ¿Por qué es esto? No puedo encontrar ninguna documentación sobre las ventajas de (( ))más de [[ ]]cualquier lugar, y encuentro que la sintaxis es considerablemente más obvia.

Por ejemplo:

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

da

[adam@hendrix test]$ ksh -n test.sh
test.sh: warning: line 3: -eq within [[...]] obsolete, use ((...))
yo y
fuente

Respuestas:

8

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
Pausado hasta nuevo aviso.
fuente