escolha entre um dos dois programas no script bash

1

Eu tenho um script (bash) que gostaria de rodar em dois computadores diferentes, um é o OpenBSD com o programa sha256 , o outro é o Ubuntu com sha256sum . Qual é a melhor / prática padrão para permitir que o script manipule os dois casos?

Observe que, para sha256 vs sha256sum , as outras opções do programa não precisariam ser alteradas, mas para uma escolha diferente de programas, como wget vs. curl , os outros parâmetros mudaria também (por exemplo, wget vs. curl -O ). Portanto, a melhor resposta permitiria diferentes parâmetros de linha de comando, dependendo do programa disponível.

Uma maneira de corrigir o programa é usar uma variável que muda dependendo do status de saída de command , hash ou type , conforme essa SO pergunta

por exemplo,

SHA_PROGRAM=sha256
command -v "$SHA_PROGRAM"
# If the exit status of command is nonzero, try something else 
if [ "$?" -ne "0" ]; then
    command -v "sha256sum"
    if [ "$?" -ne "0" ]; then
        printf "This program requires a sha256 hashing program, please install one\n" 1>&2
        exit 1
    else
        SHA_PROGRAM=sha256sum
    fi 
fi
$SHA_PROGRAM $MYFILE

Mas, assim, parece um pouco detalhado para mim, para não mencionar o problema da declaração if aninhada.

Poderia ser generalizado um pouco usando uma matriz de comandos possíveis:

declare -a POSSIBLE_COMMANDS=("sha256" "sha256sum")
SHA_PROGRAM=""
for $OPT in "${POSSIBLE_COMMANDS[@]}"
do
    command -v "$OPT"
    # if the exit status of command is zero, set the command variable and exit the loop
    if [ "$?" -eq "0" ]; then
        SHA_PROGRAM=$OPT
        break
    fi
done 

# if the variable is still empty, exit with an error    
if [ -z "$SHA_PROGRAM" ]; then
    printf "This program requires a sha256 program. Aborting\n" 1>&2
    exit 1
fi

$SHA_PROGRAM $MY_FILE

Essa maneira também funcionaria, eu acredito, mas espero obter conselhos de um programador mais experiente e melhor, caso eu esteja perdendo alguma solução melhor (talvez um uso inteligente do operador || ?).

    
por hilcharge 13.08.2015 / 04:18

1 resposta

1

Como no comentário de @aegashi, o if command -v ...; then ... parece acertar na cabeça, simples e claro.

Exemplo:

# The SHA_CMD variable can be used to store the appropriate command for later use
SHA_CMD=""
if command -v sha256; then
    SHA_CMD=sha256
elif command -v sha256sum; then 
    SHA_CMD=sha256sum
else 
    printf "This program requires a a sha256 program installed\n" 1>&2
    exit 1
fi 
"$SHA_CMD" "$MY_FILE" > "$MY_FILE.sha"
# Note: if any of the possible sha commands had command line parameters, then the quotes need to be removed from around $SHA_CMD
    
por 13.08.2015 / 05:57

Tags