Estoy empezando a aprender a escribir scripts para el terminal bash, pero no puedo encontrar la manera de hacer que las comparaciones funcionen correctamente. El script que estoy usando es:
echo "enter two numbers";
read a b;
echo "a=$a";
echo "b=$b";
if [ $a \> $b ];
then
echo "a is greater than b";
else
echo "b is greater than a";
fi;
El problema es que compara el número desde el primer dígito, es decir, 9 es mayor que 10, pero 1 es mayor que 09.
¿Cómo puedo convertir los números en un tipo para hacer una comparación verdadera?
;
al final de la línea son superfluas. No hace ningún daño, solo un desperdicio de pulsaciones de teclas (a menos que disfrute de escribir punto y coma).10#$number
así senumber=09; echo "$((10#$number))"
generará9
mientrasecho $((number))
que producirá un error de "valor demasiado grande para la base".>
que hace el operador en el[
comando es comparar el orden en que deben ordenarse dos cadenas, en lugar del orden en que se ordenarían como números. Puedes encontrar más información enman test
.Respuestas:
En bash, debe hacer su verificación en contexto aritmético :
Para shells POSIX que no son compatibles
(())
, puede usar-lt
y-gt
.Puede obtener una lista completa de operadores de comparación con
help test
oman test
.fuente
"$a" -gt "$b"
es la respuesta correcta. Aquí hay una buena lista de operadores de prueba: Construcciones de prueba .test
es un programa como es[
. Entonceshelp test
da información sobre eso. Para averiguar qué hacen los incorporados ([[
y((
), debe usarhelp bash
y navegar a esa parte.Llano y simple
Puede consultar esta hoja de referencia si desea más comparaciones de números en el maravilloso mundo de Bash Scripting.
En breve, los enteros solo se pueden comparar con:
fuente
"$a"
y"$b"
no son estrictamente necesarias, pero son una buena práctica. Las llaves no hacen nada útil aquí."
obligatorias las citas o[ $a -eq $b ]
también está bien?if [[ $a -eq $b ]];then
También hay algo bueno que algunas personas podrían no saber:
Este código imprimirá el número más pequeño de
a
yb
fuente
b
sia == b
.echo "The smaller number is $(( a < b ? a : b ))."
a < b
todavía es cierto sia == b
. No conozco todos los caprichos de los condicionales de Bash, pero es casi seguro que hay situaciones en las que esto marcaría la diferencia.a == b
, entonces sea < b
evalúa como falso, razón por la cual se imprimiríab
.En Bash prefiero hacer esto, ya que se dirige más a sí mismo como una operación condicional, a diferencia del uso
(( ))
que es más aritmético.A menos que haga cosas complejas como
Pero cada uno tiene sus propias preferencias. Lo triste es que algunas personas imponen sus estándares no oficiales.
Actualizar:
En realidad también puedes hacer esto:
Lo que le permite agregar algo más que podría hacer
[[ ]]
además de cosas aritméticas.fuente
[[ ]]
fuerza un contexto aritmético como(( ))
, dondeN
se trata como si lo fuera$N
, pero no creo que sea correcto. O, si esa no era la intención, el uso deN
yM
es confuso.[[
comando,Arg1
yArg2
se evalúan como expresiones aritméticas [...]".NUMBER=0.0; while [[ "$NUMBER" -lt "1.0" ]]; do
y dicebash: [[: 0.0: syntax error: invalid arithmetic operator (error token is ".0")
Este código también puede comparar flotadores. Está utilizando awk (no es puro bash), sin embargo, esto no debería ser un problema, ya que awk es un comando POSIX estándar que probablemente se envía por defecto con su sistema operativo.
Para acortar su uso, use esta función:
fuente
bash
no puedo compararlos correctamente (pruebaif (( 18446744073692774399 < 8589934592 )); then echo 'integer overflow'; fi
).awk
funciona como un encanto (if awk "BEGIN {return_code=(18446744073692774399 > 8589934592) ? 0 : 1; exit} END {exit return_code}"; then echo 'no integer overflow'; fi
).Si tiene flotantes, puede escribir una función y luego usarla, por ejemplo
fuente
El contenido del soporte (por ejemplo,
[[ $a -gt $b ]]
o(( $a > $b ))
) no es suficiente si desea utilizar también números flotantes; informaría un error de sintaxis. Si desea comparar números flotantes o números flotantes con enteros, puede usar(( $(bc <<< "...") ))
.Por ejemplo,
Puede incluir más de una comparación en la declaración if. Por ejemplo,
Eso es útil si desea verificar si una variable numérica (entera o no) está dentro de un rango numérico.
fuente
if [ "$(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b; fi
if [ $(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b"; fi
? (Creo que su comando fue mal escrito). Si es así, eso también funciona. El comando Bash Calculator (bc) es un comando de calculadora básico. Algunos ejemplos de uso más encontrados aquí y aquí . Sin embargo, no sé por qué mi comando de ejemplo no funcionó para ti.Resolví esto usando una pequeña función para convertir cadenas de versión a valores enteros simples que se pueden comparar:
Esto hace dos suposiciones importantes:
Por ejemplo
Ejemplo de prueba si el
npm
comando cumple con el requisito mínimo ...fuente