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 le suivant:
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
Une fonction Bash ne peut pas retourner une chaîne directement comme vous le souhaitez. Vous pouvez faire trois choses:
Cela est également vrai pour d’autres coquilles.
Voici comment effectuer chacune de ces options:
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
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
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
Vous travaillez trop fort. Votre script entier devrait être:
si mkdir $ lockdir 2> / dev / null; puis verrou d'écho acquis autre echo ne pouvait pas acquérir lock> & 2 Fi
mais même cela est probablement trop verbeux. Je le coderais:
mkdir $ lockdir || sortie 1
mais le message d’erreur qui en résulte est un peu obscur.
Si c’est juste un test vrai / faux, faites en sorte que votre fonction return 0
pour réussir et return 1
pour échec. Le test serait alors:
if function_name; then do something else error condition fi
Je pense que le retour de 0 pour succ / 1 for fail (glenn jackman) et la réponse claire et explicative d’olibre en dit long; pour ne citer qu’une sorte d’approche “combo” pour les cas où les résultats ne sont pas binarys et que vous préférez définir une variable plutôt que “faire écho” à un résultat (par exemple si votre fonction est censée faire écho à quelque chose, cette approche sera pas de travail). Quoi alors? (ci-dessous est Bourne Shell)
# Syntax _w (wrapReturn) # arg1 : method to wrap # arg2 : variable to set _w(){ eval $1 read $2 <
comme dans (oui, l'exemple est un peu idiot, c'est juste un exemple)
getDay(){ d=`date '+%d'` [ $d -gt 255 ] && echo "Oh no a return value is 0-255!" && BAIL=0 # this will of course never happen, it's just to clarify the nature of returns return $d } dayzToSalary(){ daysLeft=0 if [ $1 -lt 26 ]; then daysLeft=`expr 25 - $1` else lastDayInMonth=`date -d "`date +%Y%m01` +1 month -1 day" +%d` rest=`expr $lastDayInMonth - 25` daysLeft=`expr 25 + $rest` fi echo "Mate, it's another $daysLeft days.." } # main _w getDay DAY # call getDay, save the result in the DAY variable dayzToSalary $DAY