Iterar Através da Matriz no Bash; Sair se nenhuma correspondência for encontrada

1

Na função a seguir, posso percorrer uma matriz e, se uma correspondência for encontrada, interromper o loop e continuar com o restante do programa (conforme pretendido).

Eu gostaria, no entanto, que a função saia do restante do programa se exatamente nenhuma correspondência for encontrada. Como posso conseguir isso? (Eu não posso tê-lo sair na primeira vez que uma correspondência não for encontrada, e colocar um exit 1 no final do loop não faz o que pretendo).

Tenho certeza de que estou negligenciando algo óbvio, mas o que?

#!/usr/bin/env bash 

# Array 
MATLAB_VERSION=(
    MATLAB9.4.app
    MATLAB9.3.app
    MATLAB9.2.app
    MATLAB9.1.app
    MATLAB9.0.app
    MATLAB8.6.app
    MATLAB8.5.app
    MATLAB8.3.app 
    MATLAB8.0.app 
    MATLAB7.5.app 
    MATLAB.app 
)

matlab_check() { 
    # is MATLAB*.*.app installed in /Applications?  
    # iterate through array & tell me what you find 

    for MATLAB in "${MATLAB_VERSION[@]}"; 
    do  
        if [ -d "/Applications/$MATLAB" ]; then 
            printf "%s\n" "FOUND $MATLAB IN /Applications, CONTINUING..."
            break 
        else 
            printf "%s\n" "SEARCHING for $MATLAB in /Applications..." 
        fi 
    done 
} 

matlab_check 
    
por marshki 13.08.2018 / 20:43

1 resposta

2

Você pode return de toda a função imediatamente quando encontrar uma correspondência. Dessa forma, você pode ter uma "parte final" após o loop, que só é executado se nenhuma correspondência for encontrada. Algo parecido com isto:

#!/usr/bin/env bash 
# You might not care for this declaration of the array contents,
# but it does the same thing, and keeps my example nice and short
MATLAB_VERSION=( MATLAB{9.{4..0},8.{6,5,3,0},{7.5,}}.app )

# RC 0 = found
# RC 1 = not found
matlab_check() {
    for MATLAB in "${MATLAB_VERSION[@]}"; do
        if [ -d "/Applications/${MATLAB}" ]; then
            echo "Found in ${MATLAB}"
            return 0
        fi
    done

    return 1
}

matlab_check
echo rc is $?

E se você não quisesse exibir detalhes de onde foi encontrado, a parte if..fi poderia ser reduzida a apenas isso. Não é necessário usar return 0 porque neste ponto sabemos que $? deve ser 0, portanto, apenas return sem argumentos.

[ -d "/Applications/${MATLAB}" ] && return
    
por 13.08.2018 / 21:16

Tags