Bash: Como usar funções personalizadas (que retornam verdadeiro ou falso) em construções condicionais?

Bash: Como usar funções personalizadas (que retornam verdadeiro ou falso) em construções condicionais?

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 ifinstruçõ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, whilee 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 returnembutido 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 casecomando composto, que retorna com o último comando executado (ou seja, o do trueou o falsecomando 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 testcomando), 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 [/ testpode ser usada para realizar uma série de testes como o -ntacima ou comparando strings ou números pares.

No entanto, não há operador de colchetes duplos no bash.

informação relacionada