web-dev-qa-db-pt.com

Verifique se algum dos parâmetros para um script bash corresponde a uma string

Eu estou tentando escrever um script onde eu quero verificar se algum dos parâmetros passados ​​para um script bash corresponder a uma seqüência de caracteres. A maneira que eu tenho configurado agora é

if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]

mas pode haver um grande número de parâmetros, então eu queria saber se existe uma maneira melhor de fazer isso?

Obrigado

EDIT: Eu tentei este pedaço de código fora e liguei para o script com a opção, -disableVenusBld, mas ainda imprime "Starting build". Estou fazendo algo errado? Desde já, obrigado!

while [ $# -ne 0 ]
do
    arg="$1"
    case "$arg" in
        -disableVenusBld)
            disableVenusBld=true
            ;;
        -disableCopperBld)
            disableCopperBld=true
            ;;
        -disableTest)
            disableTest=true
            ;;
        -disableUpdate)
            disableUpdate=true
            ;;
        *)
            nothing="true"
            ;;
    esac
    shift
done

if [ "$disableVenusBld" != true ]; then
    echo "Starting build"
fi
58
iman453

Parece que você está fazendo manipulação de opções em um script Shell. Aqui está o idioma para isso:

#! /bin/sh -

# idiomatic parameter and option handling in sh
while test $# -gt 0
do
    case "$1" in
        --opt1) echo "option 1"
            ;;
        --opt2) echo "option 2"
            ;;
        --*) echo "bad option $1"
            ;;
        *) echo "argument $1"
            ;;
    esac
    shift
done

exit 0

(Existem algumas convenções para recuar o ;;, e algumas shells permitem que você dê as opções como (--opt1), para ajudar com a correspondência de chaves, mas esta é a idéia básica)

56
Norman Gray

Isso funcionou para mim. Faz exatamente o que você pediu e nada mais (sem opção de processamento). Se isso é bom ou ruim, é um exercício para o cartaz :)

if [[ "$*" == *YOURSTRING* ]]
then
    echo "YES"
else
    echo "NO"
fi

Isso aproveita o manuseio especial dos colchetes $* e super-teste [[]].

22
Rich Homolka

Que tal pesquisar (com curingas) todo o espaço de parâmetros:

if [[ [email protected] == *'-disableVenusBld'* ]]
then

Edit: Ok, ok, então essa não foi uma resposta popular. Que tal este, é perfeito !:

if [[ "${@#-disableVenusBld}" = "[email protected]" ]]
then
    echo "Did not find disableVenusBld"
else
    echo "Found disableVenusBld"
fi

Edit2: Ok, ok, talvez isso não seja perfeito ... Pense que funciona somente se -param estiver no início da lista e também corresponder -paramXZY ou -paramABC. Eu ainda acho que o problema original pode ser resolvido muito bem com manipulação de string bash, mas eu não tenho muito rachado aqui ... -Pode você?

8
Rich
disCopperBld=
for x; do
  if [ "$x" = "-disCopperBld" ]; then disCopperBld=1; break; fi
done
if [ -n "$disCopperBld" ]; then
  ...
fi

Se você precisar testar apenas os parâmetros que começam em $3, faça a pesquisa em uma função:

## Usage: search_trailing_parameters NEEDLE NUM "[email protected]"
## Search NEEDLE amongst the parameters, skipping $1 through ${$NUM}.
search_trailing_parameters () {
  needle=$1
  shift $(($2 + 2))
  for x; do
    if [ "$x" = "$needle" ]; then return 0; fi
  done
  return 1
}
if search_trailing_parameters -disCopperBld 2 "[email protected]"; then
  ...
fi

Mas eu me pergunto por que você está tentando fazer isso em primeiro lugar, não é uma necessidade comum. Normalmente, você processaria opções em ordem, como na resposta de Dennis à sua pergunta anterior .

2
Gilles