Correspondência de padrões dos argumentos de entrada

1

Estamos tentando aprimorar um de nossos scripts.

Os usuários passarão alguns argumentos e parte dos argumentos terá 5.0.3 . Por exemplo, o argumento de entrada seria como Jboss5.0.3GA . Como ele (Jboss5.0.3GA) tem "5.0.3", tentaremos localizar o arquivo binário de instalação "Jboss5.0.3GA.tar".

O script atual que temos agora é um script ksh. Estou tentando usar uma condição if com o script.

Exemplos de casos de uso e resultados:

./test.sh Jboss5.0.3GA
Match found... we'll try to locate the installation binary
./test.sh Jboss5.0.3
Match found... we'll try to locate the installation binary
./test.sh 5.0.3
Match found... we'll try to locate the installation binary
./test.sh Jboss5.1.3
No Match found ... we'll be exiting the script.
    
por user31522 31.01.2013 / 16:14

2 respostas

4

Correspondência de padrões em shells POSIX é feita com a construção case . ksh também como o operador [[ x = pattern ]] (também copiado por bash e zsh ) e [[ x =~ regexp ]] em versões recentes.

Então:

case $1 in
  (*5.0.3*)
    install=$1.tar
    echo Found;;
  (*)
    echo >&2 Not found
    exit 1;;
esac
    
por 31.01.2013 / 23:13
1

Eu não sou especialista em expressões regulares, mas isso funciona, pelo menos pelo que você descreveu.

#!/bin/sh

argument="$1"

#if [[ $argument =~ [a-zA-Z]*5\.0\.3[a-zA-Z]+ ]]; then# only works on bash
if echo $argument | egrep -q '[a-zA-Z]*5\.0\.3[a-zA-Z]+'; then
  #echo "Found: ${BASH_REMATCH[0]}" # for bash
  echo "Match Found"

  # you can check for $argument at some other location, here.

else
  echo "No match"
fi

Salvando-o como test e executando-o, apresenta os seguintes resultados:

bash test 333xxxx5.0.3xxxxx777
Match Found

bash test 333xxxx5.0.2xxxxx777
No match

bash test 5.0.3xxxxx777
Match Found

bash test 5.0.2xxxxx777
No match

Você pode adicionar ^ no início e $ no final, para corresponder à sequência completa ou nada. Assim ^[a-zA-Z]*5\.0\.3[a-zA-Z]+$

    
por 31.01.2013 / 17:20