Eu sei que existem valores booleanos bash
, mas nunca os vejo usados em lugar algum.
Quero escrever um invólucro para algumas informações frequentemente pesquisadas na minha máquina, por exemplo, se essa unidade USB específica foi inserida / montada.
Qual seria a melhor prática para conseguir isso?
Uma linha?
drive_xyz_available=true
Um número (0 para verdadeiro, ≠ 0 para falso)?
drive_xyz_available=0 # evaluates to true
Uma função?
drive_xyz_available() { if available_magic; then return 0 else return 1 fi }
Eu me pergunto principalmente sobre o que seria esperado por outras pessoas que gostariam de usar o wrapper. Eles esperariam que um valor booleano, um comando como variável ou uma função chamasse?
Do ponto de vista da segurança, acho que a segunda opção é a mais segura, mas adoraria ouvir suas experiências.
shell
shell-script
Minix
fonte
fonte
help true ; help false ; help exit
Respostas:
Basta definir uma variável para qualquer coisa, exceto não nulo, para que o acima funcione, mas
[ -n "$var" ]
seria mais curto, se não tão óbvio.Em geral, quando um script interpreta uma variável de ambiente como verdadeira ou falsa, ele interpreta qualquer valor como verdadeiro (e às vezes usa o referido valor para configurar alguma opção) ou um valor nulo como falso.
O exemplo acima retorna o
!not
valor booleano do len do seu primeiro argumento - se o argumento contiver qualquer número de caracteres diferente de 0, ele retornará 0; caso contrário, se não houver caracteres, ele retornará 1. Este é o mesmo teste com o qual você pode executar[ -n "$var" ]
, basicamente , mas ele só quebra-lo em um pouco de função chamadabool()
.Normalmente, é assim que uma variável de flag funciona. Por exemplo:
Onde outras partes de um script precisam apenas procurar qualquer valor
$dir
para avaliar sua utilidade. Isso também é útil no que diz respeito à substituição de parâmetros - pois os parâmetros podem ser expandidos para valores padrão para preencher valores vazios ou não definidos, mas, caso contrário, serão expandidos para um valor predefinido como ...... o que imprimiria ...
Obviamente, também é possível fazer o oposto,
:+
mas isso só pode fornecer um padrão predefinido ou nada, enquanto o formulário acima pode fornecer um valor ou um valor padrão.E assim, com relação às três opções - qualquer uma pode funcionar dependendo de como você escolhe implementá-la. 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 uma vez e o tipo pronto? Nesse caso, execute a função; caso contrário, provavelmente será necessário um dos outros dois.
fonte
true
oufalse
a uma variável, você pode então fazerif $variable; then ...
$IFS
- e se o valor do var puder conter qualquer tipo de entrada do usuário, também haverá pura sorte. Se o valor não for desconhecido, para começar, há pouca necessidade de testá-lo. Mais segurança você pode fazerif ${var:+":"} false; then
ao trabalhar com valores nulos booleanos / não nulos. Mas isso raramente é mais útil do que[ -n "$var" ] &&
variable=false
e defini-lo como verdadeiro de acordo com qualquer condição (como faria ao usar uma variável em C), não haverá problema algum: qual é a sua obsessão com valores variáveis do IFS e valores aleatórios de variáveis etc.? .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 [ ... ]
ouif [[ ]]
ouif 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
efalse
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, enquantofalse
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íciax
porque, se tiver$variable
comprimento zero, isso protege contra a criação de um comando falsoif [ = "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 simplesmenteexit
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 simplesmentese você estiver testando a existência de um nó de dispositivo (ou grep
/proc/mounts
para verificar se ele está montado?).fonte
drive_xyz_available()
ser a mais comum?y = true
caso comum ? Na minha experiência, a maioria dos scripts de wrapper testa qualquer valor não nulo para considerá-lo verdadeiro - pelo menos no que diz respeito às variáveis de ambiente interpretadas. Caso contrário, eles ignoram completamente os vagões.if
teste não é necessária se a variável for citada;if [ "$variable" = "yes" ]
funciona bem mesmo que a variável $ não esteja definida.Basicamente, qualquer número que não seja 0 é verdadeiro e 0 é falso. Razão para retornar valores como 0 para um final bem-sucedido de um script ou qualquer outro número para identificar tipos diferentes de erros.
$?
retornará o código de saída do comando / executável anterior, sendo 0 sucesso e qualquer outro número o erro que foi retornado.Então, eu usaria esse método para verdadeiro / falso.
if (( ! $? ));then OK;else NOOK;fi
fonte
true; echo $?
efalse; echo $?
.!
o resultado para que seja VERDADEIRO. O resultado de um comando é 0 quando finalizado corretamente, o que não significa que 0 seja verdadeiro. A palavratrue
pode ser 0, mas 0 nunca é verdadeiro como aif
condição demonstra.0
étrue
porqueif(!x){True();}else{False();}
chamaráTrue()
quandox==0
. Mas a verificação correta não seria!x
, mas sim!!x
.if
eu apenas declarar o fato de que aqui (em bash, ou ksh, ou tsh, ou ....) como em C / C ++ a 0 é FALSO, qualquer outro número é TRUE, como você pode ler no link a seguir, implementações iniciais de C não forneciam tipo booleano, sendo definidas como ints em que 0 era FALSE e 1 TRUE en.wikipedia.org/wiki/Boolean_data_type .