Je souhaite renvoyer 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
shell
return-value
Mridul Vishal
la source
la source
Réponses:
Une fonction Bash ne peut pas renvoyer une chaîne directement comme vous le souhaitez. Vous pouvez faire trois choses:
Ceci est également vrai pour certains autres obus.
Voici comment faire chacune de ces options:
1. Chaînes d'écho
2. Retourner l'état de sortie
3. Variable de partage
la source
function
mot clé pour définir une fonction bash. Cela le rendrait moins portable. Enlevez-le.Vous travaillez beaucoup trop dur. Votre script entier doit être:
mais même cela est probablement trop verbeux. Je le coderais:
mais le message d'erreur qui en résulte est un peu obscur.
la source
mkdir "$lockdir" || { echo "could not create lock dir" >&2 ; exit 1 ; }
(notez le;
devant l'accolade fermante). De plus, je définis souvent une fonction d'échec qui prend un paramètre de message facultatif qu'elle imprime sur stderr, puis se termine avec le code de retour 1, ce qui me permet d'utiliser le plus lisiblemkdir "$lockdir" || fail "could not create lock dir"
.cmd || fail "error msg" || return 1
si vous souhaitez faire cela, n'est-ce pas?fail
fonction utilisée uniquement pour des situations mortelles.Si c'est juste un test vrai / faux, ayez votre fonction
return 0
pour le succès etreturn 1
pour l'échec. Le test serait alors:la source
Je pense que renvoyer 0 pour succ / 1 pour échec (glenn jackman) et la réponse claire et explicative d'olibre dit tout; juste pour mentionner une sorte d'approche "combo" pour les cas où les résultats ne sont pas binaires et que vous préférez définir une variable plutôt que de "renvoyer" un résultat (par exemple, si votre fonction est AUSSI supposée faire écho à quelque chose, cette approche ne fonctionne pas). Et alors? (ci-dessous est Bourne Shell)
comme dans (oui, l'exemple est un peu idiot, c'est juste un ... exemple)
la source
Si vous avez des paramètres à passer à une fonction et que vous souhaitez une valeur en retour. Ici, je passe "12345" comme argument à une fonction et après le traitement, je renvoie la variable XYZ qui sera affectée à VALUE
Production:
la source