Criando contém função para uma matriz Bash

1

Eu tenho isso contém função que é suposto para verificar se uma matriz tem um certo valor. A matriz em si é passada como o primeiro argumento e o valor é o segundo argumento.

#!/usr/bin/env bash

set -e;

branch_type="${1:-feature}";
arr=( 'feature', 'bugfix', 'release' );

contains() {
    local array="$1"
    local seeking="$2"
    echo "seeking => $seeking";
#    for v in "${!array}"; do
     for v in "${array[@]}"; do
        echo "v is $v";
        if [ "$v" == "$seeking" ]; then
         echo "v is seeking";
            return 0;
        fi
    done
   echo "returning with 1";
   return 1;
}

if ! contains "$arr" "$branch_type"; then
    echo "Branch type needs to be either 'feature', 'bugfix' or 'release'."
    echo "The branch type you passed was: $branch_type"
    exit 1;
fi

echo "all goode. branch type is $branch_type";

se você executar o script sem argumentos, ele deve funcionar, já que o padrão é "feature", mas, por algum motivo, a pesquisa não corresponde a nada. Eu não estou recebendo um erro, mas as funções contém não está funcionando como desejado.

Quando executo o script sem argumentos, fico:

seeking => feature
v is feature,
returning with 1
Branch type needs to be either 'feature', 'bugfix' or 'release'.
The branch type you passed was: feature

agora isso é estranho

    
por Alexander Mills 07.07.2018 / 08:55

2 respostas

1

NOTA: vou mostrar como corrigir isso para que funcione no Bash 4.

Acho que você está passando a matriz para a função incorretamente:

$ cat contains.bash
#!/usr/bin/env bash

branch_type="${1:-feature}";
arr=('feature' 'bugfix' 'release');

contains() {
    local array=$1
    local seeking="$2"
    for v in ${!array}; do
        if [ "$v" == "$seeking" ]; then
            return 0;
        fi
    done
   return 1;
}

if ! contains arr $branch_type; then
    echo "Branch type needs to be either 'feature', 'bugfix' or 'release'."
    echo "The branch type you passed was: $branch_type"
    exit 1;
fi

echo "the array contains: $branch_type";

Eu mudei as coisas um pouco e agora parece estar funcionando:

$ ./contains.bash
the array contains: feature

Alterações

Eu só fiz 2 modificações no seu script original. Eu mudei como a função contains() estava sendo chamada para que ela passasse o nome da array arr para esta linha:

if ! contains arr $branch_type; then

e alterou essa linha dentro da função contains() , onde a matriz é definida usando os argumentos passados, retirando as aspas da configuração da variável local array :

    local array=$1

Referências

por 07.07.2018 / 09:08
1

Algo idiomático que funciona com o Bash3, é assim:

#!/usr/bin/env bash

set -e; 

branch_type="${1:-feature}";
arr=( 'feature' 'bugfix' 'release' );

contains() {

    local seeking="$1"
    shift 1;
    local arr=( "$@" )

    for v in "${arr[@]}"; do
        if [ "$v" == "$seeking" ]; then
            return 0;
        fi
    done
   return 1;
}

if ! contains "$branch_type" "${arr[@]}"; then
    echo "Branch type needs to be either 'feature', 'bugfix' or 'release'."
    echo "The branch type you passed was: $branch_type"
    exit 1;
fi

echo "the array contains: $branch_type";

o desligamento real foi que eu estava tentando fazer isso:

local seeking="$1"
local arr=( "$2" )

mas isso é necessário:

local seeking="$1"
shift 1;
local arr=( "$@" )
    
por 07.07.2018 / 09:55