Históricamente, el test
comando existió primero (al menos desde la Séptima Edición de Unix en 1979). Se utiliza los operadores =
y !=
para comparar cadenas, y -eq
, -ne
, -lt
, etc, para comparar números. Por ejemplo, test 0 = 00
es falso, pero test 0 -eq 00
es cierto. No sé por qué se eligió esta sintaxis, pero puede haber sido para evitar usar <
y >
, que el shell habría analizado como operadores de redirección. El test
comando obtuvo otra sintaxis unos años más tarde: [ … ]
es equivalente a test …
.
La [[ … ]]
sintaxis condicional, en cuyo interior <
y >
se puede utilizar como operadores sin citar, se añadió más tarde, en ksh. Mantuvo la compatibilidad con versiones anteriores [ … ]
, por lo que utilizó los mismos operadores, pero agregó <
y >
para comparar cadenas (por ejemplo, [[ 9 > 10 ]]
pero [[ 9 -lt 10 ]]
). Para obtener más información, consulte el uso de soporte simple o doble - bash
Las expresiones aritméticas también llegaron después del test
comando, en el shell Korn , en algún momento de la década de 1980. Siguieron la sintaxis del lenguaje C, que era muy popular en los círculos de Unix. Por lo tanto, utilizaron operadores de C: ==
para igualdad, <=
para menor o igual, etc.
La Séptima Edición de Unix no tenía expresiones aritméticas, pero tenía el expr
comando , que también implementó una sintaxis tipo C para operaciones de enteros, incluidos sus operadores de comparación. En un script de shell, los caracteres <
y >
tuvieron que ser citados para protegerlos del shell, por ejemplo, if expr 1 \< 2; …
es equivalente a if test 1 -lt 2; …
. La adición de expresiones aritméticas al shell hizo que la mayoría de los usos de expr
obsoletos, por lo que hoy en día no se conoce bien.
En un script sh, generalmente usaría expresiones aritméticas para calcular un valor entero y [ … ]
comparar enteros.
if [ "$((x + y))" -lt "$z" ]; then …
En un script ksh, bash o zsh, puede usar ((…))
para ambos.
if ((x + y < z)); then …
El [[ … ]]
formulario es útil si desea utilizar condicionales que involucren otras cosas que no sean enteros.
= != < <= > >=
comparar cadenas .1 -eq 01
but1 != 01
and8 -lt 42
but8 > 42