entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Problema con una condición simple en bash

Algo tan simple como esto y no sé por qué me está dando problemas:

#!/bin/bash
echo "Escriba un numero entre 1 y 20:"
read vx
if [[ "$vx" < "1" || "$vx" > "20" ]]; then
  echo "Fuera del rango"
fi

La condición trabaja bien cuando pongo un número menor a 1 o mayor a 20 (como debe de ser). El problema es que también da verdadero con 3,4,5,6,7,8 y 9. (!)
Con el resto de números marcha bien.

Lo ejecuto en linux como:
./script.sh

¿Alguien ve el problema en esto?

2 Respuestas

3votos

carlossevi Puntos63580

La verdad es que no controlo demasiado bash pero voy a intentar ayudarte ya que todavía no tienes respuestas. Creo que al entrecomillar el "1" y el "20" estás haciendo una comparación de cadenas con lo que las comparas alfabéticamente.

En una comparación alfabética 3 es mayor que 20. Creo que deberías probar a no entrecomillar los números.

Por otro lado, desconozco si también funciona con los símbolos que has puesto, pero los correctos para comparaciones aritméticas son:

-lt (<)
-gt (>)
-le (<=)
-ge (>=)
-eq (==)
-ne (!=)

Resumiendo, yo probaría con:

if [[ $vx -lt 1 || $vx -gt 20 ]]; then

0voto

HoberMallow comentado

Gracias por la respuesta, en efecto yo también llegué a pensar que era por entrecomillar esas constantes, de hecho él código que pegué acá es el último intento luego de probar distintas cosas, entre ellas claro, dejar sin comillas los números. Lastimosamente el resultado es el mismo.

En teoría deberían funcionar esos operadores al ponerlos entre corchetes dobles, al menos eso dicen todos los manuales de bash, pero desconozco la razón de porque no trabaja a pesar de no tener errores aparentes.

Al final lo solucioné usando los comparadores que mencionas y escribiéndolos en corchetes simples:

if [ "$vx" -lt 1 -o  "$vx" -gt 20 ]

Y ahí si que trabaja bien. Pero aún tengo la duda porque no funciona de la otra forma.

0voto

Leonardo-Tadei comentado

Hola @HoberMallow,

respondiendo a tu pregunta de por qué no funcionan los operadores || o &&, es sencillamente porque el comando test, que tiene como alias [ solo soporta los operadores que te pasó Carlos y escritos de esa manera.

Más información en la consola ejecutando: man test o en http://unixhelp.ed.ac.uk/CGI/man-cgi?test

PD: también puede haberte dado resultados raros llamar a test como parámetro de test, que es lo que hace el [[

1voto

Adrianx002 Puntos200

Hola, creo que te puedo ayudar, aunque el post sea un poco antiguo...
El problema principal que veo en el script es que estas llamando a los numero como si fuesen cadenas literales, ya que son numeros, utilizalos para ello jeje

El script quedaria mas o menos de esta forma

#!/bin/bash
read -p "Introduce un numero entre 1 y 20: " vx
if [ ${vx} -lt 1 ] || [ ${vx} -gt 20 ]
    echo "El numero esta fuera de rango"
fi

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta