Em bash
toda variável há essencialmente uma string (ou uma matriz ou uma função, mas vamos falar sobre variáveis regulares aqui).
As condições são analisadas com base nos valores de retorno dos comandos de teste - o valor de retorno não é uma variável, é um estado de saída. Quando você avalia if [ ... ]
ou if [[ ]]
ou if grep something
algo assim, o valor de retorno 0 (não a cadeia 0, mas o status de saída 0 = sucesso) significa verdadeiro e o restante significa falso (portanto, exatamente o oposto do que você está acostumado nas linguagens de programação compiladas, mas como há uma maneira de obter sucesso e muitas maneiras de falhar, e o resultado esperado da execução geralmente é bem-sucedido, 0 é usado como o resultado padrão mais comum se nada der errado). Isso é muito útil porque qualquer binário pode ser usado como teste - se falhar, é falso, caso contrário, é verdade.
true
e false
programas (geralmente substituídos por componentes internos) são apenas pequenos programas úteis que não fazem nada - true
conseguem não fazer nada e sai com 0, enquanto false
tentam não fazer nada e "falham", saindo com 1. Parece inútil, mas é muito útil para scripts.
Quanto a como divulgar a verdade, depende de você. É bastante comum usar apenas "y" ou "yes" como verdade e uso if [ x"$variable" = x"yes" ]
(anexada a string fictícia x
porque, se tiver $variable
comprimento zero, isso protege contra a criação de um comando falso if [ = "yes" ]
que não analisa). Também pode ser útil simplesmente usar uma string vazia para false e [ -z "$variable ]
testar se o comprimento é zero (ou -n
não é zero).
De qualquer forma, é muito raro precisar transmitir valores booleanos bash
- é muito mais comum simplesmente exit
falhar ou retornar um resultado útil (ou zero se algo der errado e testar a cadeia vazia), e a maioria dos casos pode teste a falha diretamente do status de saída.
No seu caso, você deseja uma função que atue como qualquer outro comando (portanto, retorne 0 em caso de sucesso); portanto, sua última opção parece a escolha certa.
Além disso, você pode nem precisar de return
instruções. Se a função for simples o suficiente, você poderá usar o fato de simplesmente retornar o status do último comando executado na função. Portanto, sua função pode ser simplesmente
drive_xyz_available() {
[ -e /dev/disk/by-uuid/whatever ]
}
se você estiver testando a existência de um nó de dispositivo (ou grep /proc/mounts
para verificar se ele está montado?).
help true ; help false ; help exit