177 votes

Renvoyer la valeur de la fonction appelée dans un script shell

Je veux retourner la valeur d'une fonction appelée dans un script shell. Peut-être que je manque la syntaxe. J'ai essayé d'utiliser les variables globales. Mais cela ne fonctionne pas non plus. Le code est :

 lockdir="somedir"
test() {
    retval=""

    if mkdir "$lockdir"
        then    # Directory did not exist, but it was created successfully
            echo >&2 "successfully acquired lock: $lockdir"
            retval="true"
        else
            echo >&2 "cannot acquire lock, giving up on $lockdir"
            retval="false"
    fi
    return retval
}


retval=test()
if [ "$retval" == "true" ]
    then
        echo "directory not created"
    else
        echo "directory already created"
fi

370voto

olibre Points 6069

Une fonction Bash ne peut pas renvoyer une chaîne directement comme vous le souhaitez. Vous pouvez faire trois choses :

  1. Faire écho à une chaîne
  2. Renvoie un état de sortie, qui est un nombre, pas une chaîne
  3. Partager une variable

Ceci est également vrai pour d'autres coquilles.

Voici comment faire chacune de ces options :

1. Chaînes d'écho

 lockdir="somedir"
testlock(){
    retval=""
    if mkdir "$lockdir"
    then # Directory did not exist, but it was created successfully
         echo >&2 "successfully acquired lock: $lockdir"
         retval="true"
    else
         echo >&2 "cannot acquire lock, giving up on $lockdir"
         retval="false"
    fi
    echo "$retval"
}

retval=$( testlock )
if [ "$retval" == "true" ]
then
     echo "directory not created"
else
     echo "directory already created"
fi

2. Retourner l'état de sortie

 lockdir="somedir"
testlock(){
    if mkdir "$lockdir"
    then # Directory did not exist, but was created successfully
         echo >&2 "successfully acquired lock: $lockdir"
         retval=0
    else
         echo >&2 "cannot acquire lock, giving up on $lockdir"
         retval=1
    fi
    return "$retval"
}

testlock
retval=$?
if [ "$retval" == 0 ]
then
     echo "directory not created"
else
     echo "directory already created"
fi

3. Variable de partage

 lockdir="somedir"
retval=-1
testlock(){
    if mkdir "$lockdir"
    then # Directory did not exist, but it was created successfully
         echo >&2 "successfully acquired lock: $lockdir"
         retval=0
    else
         echo >&2 "cannot acquire lock, giving up on $lockdir"
         retval=1
    fi
}

testlock
if [ "$retval" == 0 ]
then
     echo "directory not created"
else
     echo "directory already created"
fi

18voto

William Pursell Points 56211

Vous travaillez beaucoup trop dur. L'intégralité de votre script doit être :

 if mkdir "$lockdir" 2> /dev/null; then 
  echo lock acquired
else
  echo could not acquire lock >&2
fi

mais même cela est probablement trop verbeux. je le coderais :

 mkdir "$lockdir" || exit 1

mais le message d'erreur qui en résulte est un peu obscur.

17voto

glenn jackman Points 69748

S'il ne s'agit que d'un test vrai/faux, utilisez votre fonction return 0 pour le succès et return 1 pour l'échec. Le test serait alors :

 if function_name; then
  do something
else
  error condition
fi

6voto

Rishi Bansal Points 756

Au cas où vous auriez des paramètres à transmettre à une fonction et que vous vouliez une valeur en retour. Ici, je passe "12345" comme argument à une fonction et après avoir traité la variable de retour XYZ qui sera affectée à VALUE

 #!/bin/bash
getValue()
{
    ABC=$1
    XYZ="something"$ABC
    echo $XYZ
}


VALUE=$( getValue "12345" )
echo $VALUE

Production:

 something12345

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X