Cómo hacer coincidir el patrón con un argumento de script en Linux bash

CorePress2024-01-24  11

Básicamente, tengo que crear un script bash que analice los argumentos del script y, si es solo uno, proceda a hacer coincidir el patrón. Si comienza con un número lo dice, si comienza con una letra lo dice y si no, dice que el argumento es una cadena. Si no proporcionó un argumento, dice que necesita 1, o si proporcionó 2 o más. Todo funciona, excepto el patrón que coincide. Siempre me sale el caso predeterminado. ¿Qué tiene de malo?

Tengo que usar un caso :( .

case $# in
    1) case  in
        /^?[0-9][a-zA-z]*$/) echo "Argument starts with number";;
        /^?[a-zA-z][a-zA-z]*$/) echo "Argument starts with letter";;
        *) echo "Argument is a string";;
        esac;;
    0) echo -n "You can't use 0 arguments"
        exit 1;;
    *) echo -n "You can't use 2 or more arguments"
        exit 1;;

esac

exit 0 

EDITAR: escribir esto en la terminal me da el caso predeterminado: l@ubuntu:~/Documents$ ./e4_G_L.sh contor - ¿tal vez escribí mal el argumento y la coincidencia de patrones funciona bien?

Hay un error tipográfico en la expresión regular. Supongo que a-zA-z debería ser a-zA-Z (tenga en cuenta la Z mayúscula al final).

- Socowi

27 de marzo de 2021 a las 11:26

Afaik, la declaración de caso solo admite el patrón de expresión regular global y no el normal. Intente usar =~ para expresiones regulares. p.ej. [[ $1 =~ /^?[0-9][a-zA-z]*$/ ]] que puede estar dentro de una declaración if. No soy bueno con las expresiones regulares, así que no tengo nada sobre esta pregunta. Buena suerte.

- Jetchisel

27/03/2021 a las 12:03



------------------------------------

Como se señaló en los comentarios, mayúsculas y minúsculas solo admite globos (también conocidos como comodines). Para verificar la expresión regular como en su script, puede usar [[… =~…]] pero eso sería excesivo. Como solo quieres comprobar la primera letra, los globos son suficientes.

Además, reformularía el mensaje de advertencia. Dígale al usuario qué hacer, no solo “Te equivocaste”. Buena suerte adivinando en tu próximo intento”.

if [ $# != 1 ]; then
  echo "Expected 1 argument but found $#."
  exit 1
fi
case "" in
  [0-9]*) echo "Argument starts with number" ;;
  [a-zA-Z]*) echo "Argument starts with letter" ;;
  *) echo "Argument is a string";;
esac

1

1

Esto parece ser lo que pide la pregunta, pero la expresión regular en la pregunta parece implicar que foo# (que contiene un carácter no alfabético) debe tratarse de manera diferente. No está claro qué se quiere realmente.

- William Pursell

27/03/2021 a las 11:38



------------------------------------

Usando patrones extendidos de bash:

shopt -s extglob
case $# in
    0)  echo "You can't use 0 arguments"
        exit 1
        ;;
    1)  case  in
            [0-9]+([[:alpha:]]) ) echo "A number followed by letters" ;;
            +([[:alpha:]]) ) echo "Only letters" ;;
            *) echo "Something else" ;;
        esac
        ;;
    *)  echo "You can't use 2 or more arguments"
        exit 1
        ;;
esac



------------------------------------

Gracias a todos los que se molestaron en ayudar a esta alma perdida :). Es una tarea para mi Uni, por lo que no necesito sugerencias complejas. El profesor sabe de qué se trata, así que sea breve. Terminé usando la primera respuesta.

1

Vota las soluciones útiles y acepta la que cumpla con tus requisitos haciendo clic en las flechas correspondientes.

- Pierre François

29/03/2021 a las 19:19

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare