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' ]
}
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.
$(...)
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=$?
...
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
$
Tags bash shell-script