Eu tenho uma função que dependendo de um argumento onde a funcionalidade muda.
Eu sei que posso fazer:
function foo {
PARAM1=$1
PARAM2="$2"
VAR=$3
if[[ -z "$VAR" ]]; then
# code here
else
# other code here
fi
}
Eu queria saber se existe uma abordagem mais apropriada para o bash. Isso funcionaria, mas eu não gostaria de ter algo como
foo "x" "y" "blah"
foo "x" "y" "true"
foo "y" "y" "1"
tudo para ser equivalente.
Existe uma abordagem mais adequada ao Bash?
Você pode fornecer uma opção de linha de comando para sua função. Usar opções de linha de comando sem argumentos é uma maneira comum de fornecer valores binários/booleanos ("on/off", "true/false", "enable/disable") para scripts de shell, funções de shell e utilitários em geral.
A opção
-t
funciona como um sinalizador booleano para o usuário. Usá-lo definiriaflag
dentro da função paratrue
(alterando-o de seu valor padrão defalse
). A-t
opção seria usada como o primeiro argumento para a função.A chamada da função seria feita usando
ou
onde a última chamada definiria a
flag
variável na função paratrue
.No geral
Em geral, passar booleanos para funções, em qualquer linguagem, é ilegível. por exemplo
calculate_interest 5y 4% true
. O leitor fica se perguntando o que é verdade.Portanto, use uma enumeração:
{ per_month, per_year }
. Agora você pode fazercalculate_interest 5y 4% per_year
. Isso é mais legível.Na festa
O Bash não é tipado estaticamente (ou fortemente tipado, ou tem muito de um sistema de tipos), então você pode passar muitos valores diferentes. Um vai liderar desta forma, os outros não. Não é desejável ter muitos valores diferentes que levam ao mesmo caminho.
Portanto, adicione código para verificar se a entrada é um dos dois valores aceitáveis. Faça isso no início da função, você não quer sair da metade do caminho para fazer algo.
O que fazer se você tiver que chamar uma função que recebe um booleano
Então alguém não seguiu meu conselho, e você tem que chamar uma função que recebe um booleano. O que você pode fazer para tornar seu código legível?
calculate_interest 5y 4% per_year=True
, use-os. Vai ajudar, mas não lhe diz o significado decalculate_interest 5y 4% per_year=False
.Eu recomendo seguir um formato como este:
Dessa forma, a função será mais robusta e legível:
Prós:
Contras: