Dans bash, comment stocker une valeur de retour dans une variable?

Je connais des commandes très basiques sous Linux et j'essaie d'écrire des scripts. J'ai écrit une fonction qui évalue la somme des 2 derniers chiffres dans un nombre à 5 chiffres. La fonction doit concaténer cette somme résultante entre les 2 derniers chiffres et la renvoyer. La raison pour laquelle je veux retourner cette valeur est parce que je vais utiliser cette valeur dans l'autre fonction.

Ex: si j'ai 12345, alors ma fonction calculera 4 + 5 et retournera 495.

#!/bin/bash

set -x
echo "enter: "
        read input

function password_formula
{
        length=${#input}
        last_two=${input:length-2:length}
        first=`echo $last_two| sed -e 's/(.)/1 /g'|awk '{print $2}'`
        second=`echo $last_two| sed -e 's/(.)/1 /g'|awk '{print $1}'`
        let sum=$first+$second
        sum_len=${#sum}
        echo $second
        echo $sum

        if [ $sum -gt 9 ]
        then
               sum=${sum:1}
        fi

        value=$second$sum$first
        return $value
}
result=$(password_formula)
echo $result

J'essaie de faire écho et voir le résultat mais je reçois la sortie comme indiqué ci-dessous.

-bash-3.2$ ./file2.sh 
+++ password_formula
+++ echo 'enter: '
+++ read input
12385
+++ length=8
+++ last_two=85
++++ echo 85
++++ sed -e 's/(.)/1 /g'
++++ awk '{print $2}'
+++ first=5
++++ echo 85
++++ sed -e 's/(.)/1 /g'
++++ awk '{print $1}'
+++ second=8
+++ let sum=5+8
+++ sum_len=2
+++ echo 5
+++ echo 8
+++ echo 13
+++ '[' 13 -gt 9 ']'
+++ sum=3
+++ value=835
+++ return 835
++ result='enter: 
5
8
13'
++ echo enter: 5 8 13
enter: 5 8 13

J'ai aussi essayé d'imprimer le résultat comme:

password_formula
RESULT=$?
echo $RESULT

Mais cela donne une valeur inconnue:

++ RESULT=67
++ echo 67
67

Comment puis-je stocker correctement la valeur correcte et imprimer (à vérifier) sur l'écran?

Merci d'avance.

23
demandé sur itsh 2013-02-22 02:30:21

7 réponses

Modifier cette ligne:

return $value

Comme ceci:

echo $value

Ensuite, vous pouvez capturer sa sortie.

8
répondu perreal 2013-02-21 22:34:45

La valeur de retour (aka code de sortie) est une valeur comprise entre 0 et 255 inclus. Il est utilisé pour indiquer le succès ou l'échec, pas pour renvoyer des informations. Toute valeur en dehors de cette plage sera enveloppée.

Pour renvoyer des informations, comme votre numéro, Utilisez

echo "$value"

Pour imprimer des informations supplémentaires que vous ne souhaitez pas capturer, Utilisez

echo "my irrelevant info" >&2 

Enfin, pour le capturer, utilisez ce que vous avez fait:

 result=$(password_formula)

En d'autres termes:

echo "enter: "
        read input

password_formula()
{
        length=${#input}
        last_two=${input:length-2:length}
        first=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $2}'`
        second=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $1}'`
        let sum=$first+$second
        sum_len=${#sum}
        echo $second >&2
        echo $sum >&2

        if [ $sum -gt 9 ]
        then
               sum=${sum:1}
        fi

        value=$second$sum$first
        echo $value
}
result=$(password_formula)
echo "The value is $result"
21
répondu that other guy 2013-02-21 22:37:51

Il est facile que vous devez faire écho à la valeur que vous devez retourner, puis la capturer comme ci-dessous

demofunc(){
    local variable="hellow"
    echo $variable    
}

val=$(demofunc)
echo $val
6
répondu imal hasaranga perera 2017-01-05 07:16:03

Réponse la plus Simple:

Le code de retour d'une fonction ne peut être qu'une valeur comprise entre 0 et 255 . Pour stocker cette valeur dans une variable, vous devez faire comme dans cet exemple:

#!/bin/bash

function returnfunction {
    # example value between 0-255 to be returned 
    return 23
}

# note that the value has to be stored immediately after the function call :
returnfunction
myreturnvalue=$?

echo "myreturnvalue is "$myreturnvalue
4
répondu Samuele Catuzzi 2016-02-05 11:57:37

La réponse ci-dessus suggère de changer la fonction pour echo data plutôt que de la renvoyer afin qu'elle puisse être capturée.

Pour une fonction ou un programme que vous ne pouvez pas modifier où la valeur de retour doit être enregistrée dans une variable (comme test/[, qui renvoie une valeur de succès 0/1), echo $? dans la substitution de commande:

# Test if we're remote.
isRemote="$(test -z "$REMOTE_ADDR"; echo $?)"
# Or:
isRemote="$([ -z "$REMOTE_ADDR" ]; echo $?)"

# Additionally you may want to reverse the 0 (success) / 1 (error) values
# for your own sanity, using arithmetic expansion:
remoteAddrIsEmpty="$([ -z "$REMOTE_ADDR" ]; echo $((1-$?)))"

Par exemple

$ echo $REMOTE_ADDR

$ test -z "$REMOTE_ADDR"; echo $?
0
$ REMOTE_ADDR=127.0.0.1
$ test -z "$REMOTE_ADDR"; echo $?
1
$ retval="$(test -z "$REMOTE_ADDR"; echo $?)"; echo $retval
1
$ unset REMOTE_ADDR
$ retval="$(test -z "$REMOTE_ADDR"; echo $?)"; echo $retval
0

Pour un programme qui imprime des données mais qui a également une valeur de retour à enregistrer, la valeur de retour sera capturée séparément de la sortie:

# Two different files, 1 and 2.
$ cat 1
1
$ cat 2
2
$ diffs="$(cmp 1 2)"
$ haveDiffs=$?
$ echo "Have differences? [$haveDiffs] Diffs: [$diffs]"
Have differences? [1] Diffs: [1 2 differ: char 1, line 1]
$ diffs="$(cmp 1 1)"
$ haveDiffs=$?
$ echo "Have differences? [$haveDiffs] Diffs: [$diffs]"
Have differences? [0] Diffs: []

# Or again, if you just want a success variable, reverse with arithmetic expansion:
$ cmp -s 1 2; filesAreIdentical=$((1-$?))
$ echo $filesAreIdentical
0
3
répondu Caleb Paul 2015-08-06 16:42:03

C'est dû aux instructions echo. Vous pouvez changer vos échos en impressions et revenir avec un echo. Ci-dessous fonctionne

#!/bin/bash

set -x
echo "enter: "
read input

function password_formula
{
        length=${#input}
        last_two=${input:length-2:length}
        first=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $2}'`
        second=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $1}'`
        let sum=$first+$second
        sum_len=${#sum}
        print $second
        print $sum

        if [ $sum -gt 9 ]
        then
           sum=${sum:1}
        fi

        value=$second$sum$first
        echo $value
}
result=$(password_formula)
echo $result
1
répondu Kat Farrell 2013-12-17 09:12:03

Utilise la variable spéciale bash"$?"comme ça:

function_output=${my_function}
function_return_value=$?
1
répondu Ytsen de Boer 2017-04-03 06:41:03