Um case testa vários padrões em relação a uma variável, $1 no seu exemplo.
Vários if ... elif podem fazer qualquer teste, incluindo vários padrões contra uma variável, mas isso é apenas um caso especial do geral if ... elif .
Eu sempre uso if para esse tipo de coisa, e realmente não pensei nisso, mas vamos dizer algo simples assim:
case $1 in
test)
echo "test"
;;
test2)
echo "test"
;;
test3
echo "test3"
esac
vs.
if [[ "$1" == "test" ]]
then
echo "test"
elif [[ "$1" == "test2" ]]
then
echo "test2"
elif [[ "$1" == "test3" ]]
then
echo "test3"
fi
Quais são as maiores diferenças neste caso? Alguma delas é objetivamente melhor para outra tarefa?
Um case testa vários padrões em relação a uma variável, $1 no seu exemplo.
Vários if ... elif podem fazer qualquer teste, incluindo vários padrões contra uma variável, mas isso é apenas um caso especial do geral if ... elif .
case compara o valor de uma única shell word com qualquer número de padrões especificados (se houver) e executa o valor associado shell lista (se houver) para o primeiro deles encontrado para corresponder ou nada. case avalia a palavra e cada padrão associado até a primeira correspondência, apenas uma vez. case retorna para qualquer shell lista ou então 0.
if compara o valor do status de retorno de alguns shell lista para 0 e subseqüentemente executa o then shell lista se corresponder ou então executar a lista opcional elif ou else shell (se houver) . if executa e avalia o retorno de pelo menos um shell lista para cada if em qualquer cadeia de if s com uma lista que retorne 0.
if retorna para qualquer lista then ou else executada, ou então 0, independentemente da devolução do if shell lista .