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

47

Estou tentando escrever um script onde quero verificar se algum dos parâmetros passados para um script bash corresponde a uma string. 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, por isso queria saber se existe uma maneira melhor de fazer isso?

Obrigado

EDITAR: Eu tentei este pedaço de código, e chamei o script com a opção, -disableVenusBld, mas ainda imprime "Starting build". Estou fazendo algo errado? Obrigado antecipadamente!

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
    
por iman453 08.09.2010 / 21:28

4 respostas

50

Parece que você está fazendo manipulação de opções em um script de 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

(Há algumas convenções para recuar o ;; , e alguns 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)

    
por 08.09.2010 / 21:48
16

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

if [[ "$@" == "your string" ]]
then
    echo "YES"
else
    echo "NO"
fi

Observe que o uso de $@ , em vez de $* , juntamente com o fato de ser citado, garante a flexibilidade no caso de uma cadeia de caracteres de teste com whitespeces. Com $* apenas "your" ou "string" seria correspondido. Não haveria diferença, no entanto, se não houvesse espaços em branco.

Veja esta explicação sobre as diferenças no comportamento.

    
por 08.09.2010 / 23:03
8

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

if [[ $@ == *'-disableVenusBld'* ]]
then

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

if [[ "${@#-disableVenusBld}" = "$@" ]]
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 a -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?

    
por 19.11.2015 / 17:10
1
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 "$@"
## 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 "$@"; then
  ...
fi

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

    
por 08.09.2010 / 21:40