Bash atribui resultado variável da função bool e, em seguida, verifica

4

Eu estou tentando criar uma função que retorna 0 ou 1 (ou seja, verdadeiro ou falso) e leva um argumento, em seguida, criar uma variável em outro que armazena os resultados dessa função. Finalmente, verifique se essa variável é 0 ou 1 (verdadeiro ou falso)

Aqui está uma amostra do que estou tentando

#!/bin/bash

_has_string() {
  if [ $1 == "string" ];
    return 0
  else
    return 1
  fi
}

_my_func() {
  var=$(_has_string "string")
  if [ $var == "0" ]; then
    echo "var contains string"
  else
    echo "var does not contain string"
  fi
}

_my_func

Eu tentei algumas variações disso e não consigo encontrar uma maneira de fazê-lo funcionar. Todas as minhas variações basicamente retornam o $var como nada. Não é um 0. Não nulo. Literalmente é apenas em branco.

    
por Byron Mansfield 27.05.2018 / 19:22

3 respostas

13

Você confunde a saída com o código de saída.

_my_func() {
  if _has_string 'string'; then

Você também deve citar suas variáveis; e _has_string pode ser simplificado:

_has_string() {
    [ "$1" = 'string' ]
}
    
por 27.05.2018 / 19:31
5

$(...) retorna a saída do comando: as coisas enviadas para stdout. Você quer o código de saída . Depois que um processo (ou, no seu caso, função) sai em um script bash, a variável especial $? é definida como o código de saída.

Então, ao invés de

var=$(_has_string 'string')
...

considere

_has_string 'string'
var=$?
...
    
por 27.05.2018 / 21:50
0

Como outros já apontaram, você precisa apenas usar a função dentro da instrução if . Aqui está algo que você pode não saber:

Uma função pode ser tratada como uma forma de comando composto . E de acordo com o manual bash [[ é um dos operadores que podem ser usados na construção de um comando composto. Assim, sua função _has_string() pode ser implementada da seguinte forma:

$ _has_string()[[ "$1" = "string" ]]
$ if _has_string "string"; then echo "YES"; fi
YES

É claro que isso não é portável, devido ao operador [[ . Mas podemos usar ( ) ou {} . Veja por exemplo como isso funciona em /bin/dash :

$ _has_string()( [ "$1" = "string" ]; )
$ if _has_string "string"; then echo "YES"; fi
YES
$ if _has_string "nope" ; then echo "YES"; fi                             
$ 
    
por 28.05.2018 / 07:47