2017-03-23 1 views
0

J'ai le code suivant:bash: en utilisant le code de sortie de la fonction dans les expressions conditionnelles

... 
docker_test() { 

     local masterip=$1 
     nc -zv $masterip 2377 
} 
... 
     until $(docker_test $masterip); do 
      echo "First Master not initialized yet..." 
      sleep 30 
     done 
... 

La question est - est-il approche correcte bash d'utiliser des boucles ou if/else de telle manière?

Un autre exemple pourrait être: s'il y a un problème avec le maître

if $(docker_test $masterip); then 
    echo "Passed" 
fi 
+0

Quel est le problème ici, si votre intention est géré 'nc -zv..' jusqu'à ce qu'il soit réussi (retour un code' 0') cela ressemble bien – Inian

+1

Merci @Inian. Oui cela fonctionne. Mais j'ai des doutes dans exactement 'jusqu'à $ (funcname); alors' la construction. Sera 'jusqu'à [" $ (docker_test $ masterip) "==" 0 "]' plus correct ici? Ou il peut être simplifié en toute sécurité au même code, comme le mien est? – setevoy

+2

@setevoy Voulez-vous la sortie standard ou le code de sortie de la fonction? Si ce dernier, il suffit de laisser tomber la substitution de commande. 'jusqu'à docker_test" $ master_ip "; do'. Sinon, 'until [" $ (docker_test "$ master_ip") "= 0]' ('=', pas '==') est correct. – chepner

Répondre

1

je ne risquerais pas la chance du script suspendu indéfiniment. Je voudrais faire quelque chose comme:

#!/bin/bash -eu 

readonly TRIES = 5 # attempts before failing 
readonly SLEEP = 30 # sleep in seconds 

for try in $(seq 1 $TRIES); do 
    if docker_test "$master_ip"; then 
     echo "Passed" 
     break 
    else 
     if [ $try -eq $TRIES ]; then 
      echo "Failed" 
      exit 1 # or whatever you need 
     fi 
     echo "Retrying. Try $try of $TRIES" 
     sleep $SLEEP 
    fi 
done