web-dev-qa-db-fra.com

Quelle est la bonne façon de tester une valeur de retour de fonction bash?

Je voudrais tester une valeur de retour de fonction bash dans une instruction if comme ceci:

if [[ func arg ]] ; then …

mais j'obtiens des messages d'erreur comme: opérateur binaire conditionnel attendu.

Quel est le bon moyen de le faire?

Est-ce:

 if [[ $(func arg) ]] ; then ...
51
grok12

Si c'était le code de sortie et non le résultat que vous pourriez simplement utiliser

if func arg; then ...

Si vous ne pouvez pas faire en sorte que la fonction renvoie un code de sortie correct (avec return N), et vous devez utiliser des résultats de chaîne, utilisez @Alex Gitelman answer.

$ help if:

if: if COMMANDS; then COMMANDS; [ Elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

Exécuter des commandes basées sur conditionnel.

Le if COMMANDS la liste est exécutée. Si son état de sortie est nul, le then COMMANDS la liste est exécutée. Sinon, chaque Elif COMMANDS la liste est exécutée à son tour, et si son état de sortie est nul, le then COMMANDS list est exécutée et la commande if se termine. Sinon, la liste `else COMMANDS 'est exécutée, si elle est présente. L'état de sortie de la construction entière est l'état de sortie de la dernière commande exécutée, ou zéro si aucune condition n'est vérifiée.

Exit Status: Renvoie l'état de la dernière commande exécutée.

66
kay

Cette erreur semble se produire si la fonction renvoie plus d'un mot.

Par exemple, 1 2.

Citez-le simplement:

"$(func arg)"

Échantillon:

$ if [[ 1 2 ]] ; then echo 1 ; fi
-bash: conditional binary operator expected
-bash: syntax error near `2'
$ if [[ "1 2" ]] ; then echo 1 ; fi
1

Et si vous comparez 0 vs non 0, utilisez simplement

if [[ "$(func arg)" != "0" ]]
16
Alex Gitelman

Cela m'a été utile, donc j'ajouterais les détails suivants.

Si vous devez tester deux conditions, l'une étant l'état de sortie de la fonction/commande et l'autre par exemple valeur de variable utilisez ceci:

if func arg && [[ $foo -eq 1 ]]; then echo TRUE; else echo FALSE; fi
15
Pedro Inácio