Bash - o elemento da matriz existe

2

Estou tentando ver se o primeiro argumento existe em uma matriz:

#!/bin/bash

action="$1"
actions=( install run )
actionOK=false

for i in "${actions[@]}"
do
    if [ $i=$action ]; then
        actionOK=true
    fi
done

echo $actionOK

if [ $actionOK = false ]; then
    echo "unknown action: $action"
fi

agora, ao tentar wan27 run , o script ecoa como verdadeiro, mas também é verdade para uma ação que não está na matriz, como test, foo, bar ou qualquer outra que seja

    
por François Vespa 09.02.2011 / 10:56

2 respostas

3

Acho que seu script estava funcionando para "instalar", mas não "executar".

Você precisa fazer:

for i in "${actions[@]}"
do
  ...
done

Isso ocorre porque $actions se expande para apenas o primeiro elemento da matriz.

$ array=( a b c )
$ echo $array
a
$ echo "${array[@]}"
a b c

Consulte a documentação do bash arrays para obter mais detalhes sobre como os arrays funcionam.

Any element of an array may be referenced using ${name[subscript]}. The braces are required to avoid conflicts with the shell's filename expansion operators. If the subscript is ‘@’ or ‘*’, the word expands to all members of the array name.

    
por 09.02.2011 / 10:58
0

Eu tentei o script corrigido por François Vespa e funciona para mim ok, ele produz "ação desconhecida: ..." se eu passar algo diferente de executar ou instalar.

O único erro que vejo é quando não passo nenhum argumento. Você deve verificar [$ # -gt 0] ou [$ # -eq 1] para descobrir se os argumentos foram passados.

    
por 09.02.2011 / 11:15

Tags