como faço para usar corretamente métodos personalizados que testam um argumento, por exemplo, se uma string é uma palavra ou um número de versão, em um contexto condicional em if
instruções while
, ou until
?
Especialmente os colchetes (duplos) parecem ter problemas com métodos em um lado de um teste como -gt
.
Posso apenas chamar um método? Se sim, quais são os requisitos de contexto para fazer isso? Então, dentro/fora dos colchetes (duplos) e nas diferentes instruções if
, while
e until
- como eles reagem à chamada de funções sem substituição de comando?
E se eu não usar a substituição de comandos para chamar diferentes métodos de teste, ainda posso conectá-los por operadores booleanos?
Para sua conexão, existem casos de uso em que preciso usar parênteses ou parênteses duplos?
Quando preciso de expansão de comando? Às vezes, posso precisar de expansão aritmética para chamar funções?
Responder1
Você deseja que sua função retorne sucesso/falha verdadeiro/falso por meio do status de saída como todos os outros comandos, incluindo o [
comando, usando o return
embutido com 0 como argumento para verdadeiro/sucesso e qualquer outra coisa para falso/falha ou apenas retorne com a saída do último comando executado pela função:
isnewer() {
[ "$1" -nt "$2" ]
# here returns with the status of the [ command
}
isvowel() {
case $1 in
([aeiouAEIOU]) true;; # or return 0
(*) false;; # or return 1
esac
}
Aquele retorna com o status de saída do case
comando composto, que retorna com o último comando executado (ou seja, o do true
ou o false
comando aqui).
E então na sua instrução if
/ while
, você chama essas funções, não o [
comando:
if isnewer /etc/passwd /etc/shadow; then
echo passwd newer than shadow
fi
if isvowel "$x" || isvowel "$y"; then...
Quanto às suas referências (não claras para mim) a colchetes duplos ou parênteses duplos, enquanto [
é apenas um comando normal (outro nome para o test
comando), o shell Korn e alguns derivados, incluindo bash
:
- uma
(( arithmetic expression ))
construção, que avalia a expressão aritmética (seguindo uma sintaxe semelhante à da linguagem C e variando entre shells) e retorna verdadeiro/sucesso (por meio do status de saída 0, como de costume) se o número resultante for qualquer coisa menos 0. Essa expressão aritmética a sintaxe possui alguns operadores booleanos e de comparação semelhantes aos de C (<
,>=
,||
,&&
...). - uma
[[ conditional expression ]]
construção, que avalia a expressão condicional (com sua própria sintaxe, também variando de shell para shell, e lembra a forma como[
analisa seu argumento. Essa construção, como o comando[
/test
pode ser usada para realizar uma série de testes como o-nt
acima ou comparando strings ou números pares.
No entanto, não há operador de colchetes duplos no bash.