No 'shell' básico, como coloco o resultado de uma comparação de string em uma variável booleana?
Considerar:
isweekday() {
w=$(date +%w)
if [[ $w == "0" ]] || [[ $w == "6" ]]; then
false
else
true
fi
}
Pode-se debater se seria mais claro ou não, mas existe uma maneira de atribuir o resultado da expressão 'if' a uma variável booleana, por exemplo
isweekday() {
w=$(date +%w)
wd=<boolean result of [[ $w == "0" ]] || [[ $w == "6" ]]>
return $wd
}
Depois de algumas experimentações, cheguei mais perto do que quero, mas ainda não é o que procuro:
isweekday() {
w=$(date +%w)
[[ $w == "0" ]] || [[ $w == "6" ]]
}
Isso funciona e não requer a condicional, mas parece errado, no entanto, se você fizer isso:
if isweekday; then
echo 'weekday'
fi
você obterá o resultado certo. Isso parece ser porque o código de saída de 'true' é 0 e o código de saída de 'false' é 1 (não tenho certeza por que isso é ...)
Não há variáveis booleanas. Todas as variáveis do shell são strings (embora existam recursos limitados para interpretá-los como números inteiros para comparações básicas etc e aritmética básica).
O código de saída 0 é reservado para sucesso; todos os outros códigos de saída (até o máximo de 255) significam um erro (embora algumas ferramentas não padrão usem esse recurso para comunicar resultados sem erro por meio de convenção; supõe-se que o chamador entenda e concorde com esse uso ad hoc do código de saída).
Talvez a resposta mais simples para o que você parece estar perguntando seja salvar o código de saída. Ele é exposto na variável $?
. Mas, muitas vezes, você não precisa examinar explicitamente seu valor; na verdade, seu isweekday
código final parece de longe o mais idiomático e natural, e retorna esse código [[
implicitamente.
Não entendo por que você acha que seu código final "parece errado"; é exatamente assim que você usaria uma função em uma condicional.
No entanto, em certo sentido, uma case
declaração pareceria menos confusa aqui (mas essa sintaxe é um pouco chocante no início por outros motivos, até você se acostumar).
is_weekday () {
case $(date +%w) in
0 | 6) return 1;;
esac
return 0
}
Isso é portátil para POSIX sh
, ao contrário da sintaxe Bash-only [[
... ]]
que você estava usando. Talvez veja também Diferença entre sh
ebash
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras