bool(){ return "$((!${#1}))"; }
if bool "$var"
then : do true
else : do false
Basta definir uma variável para qualquer coisa, mas não nula para o acima, para funcionar, embora [ -n "$var" ]
seja mais curto, se não tão óbvio.
Em geral, quando um script interpreta uma variável de ambiente como verdadeira ou falsa, ela interpretará qualquer valor como sendo verdadeiro (e às vezes usa o dito valor para configurar alguma opção) ou então um valor nulo como falso.
O acima retorna o valor booleano !not
do len do seu primeiro argumento - se o argumento contiver qualquer número de caracteres diferente de 0, ele retorna 0, senão, se nenhum caractere, retorna 1. Este é o mesmo teste você pode executar com [ -n "$var" ]
, basicamente, mas apenas envolve em uma pequena função chamada bool()
.
Isto é tipicamente como uma variável flag funciona. Por exemplo:
[ -d "$dir" ] || dir=
Onde outras partes de um script precisam apenas procurar por qualquer valor em $dir
para avaliar sua utilidade. Isso também é útil quando se trata de substituição de parâmetros - pois os parâmetros podem ser expandidos para valores padrão para preencher os vazios ou não definidos, mas, caso contrário, expandirão para um valor predefinido como ...
for set in yes ''
do echo "${set:-unset or null}"
done
... o que imprimiria ...
yes
unset or null
É claro que também é possível fazer o oposto com :+
, mas isso só pode dar um padrão pré-definido ou nada, enquanto o formulário acima pode lhe dar um valor ou um valor padrão.
E sobre as três opções - qualquer um poderia funcionar dependendo de como você escolhe implementá-lo. O retorno da função é autoteste, mas, se esse retorno precisar ser salvo por qualquer motivo, precisará ser colocado em uma variável. Depende do caso de uso - o valor booleano que você deseja avaliar um teste é feito uma vez e feito? Se assim for, faça a função, senão qualquer um dos outros dois é provavelmente necessário.