linux variabili - In bash, come memorizzare un valore di ritorno in una variabile?




assegnare risultato (7)

La risposta più semplice:

il codice di ritorno da una funzione può essere solo un valore compreso tra 0 e 255. Per memorizzare questo valore in una variabile devi fare come in questo esempio:

#!/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

Conosco alcuni comandi di base in Linux e sto provando a scrivere alcuni script. Ho scritto una funzione che valuta la somma delle ultime 2 cifre in un numero a 5 cifre. La funzione dovrebbe concatenare questa somma risultante tra le ultime 2 cifre e restituirla. Il motivo per cui voglio restituire questo valore è perché userò questo valore nell'altra funzione.

Es: se ho 12345, la mia funzione calcolerà 4 + 5 e restituirà 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

Sto cercando di echo e vedere il risultato, ma sto ottenendo l'output come mostrato di seguito.

-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

Ho anche provato a stampare il risultato come:

password_formula
RESULT=$?
echo $RESULT

Ma questo sta dando un qualche valore sconosciuto:

++ RESULT=67
++ echo 67
67

Come posso memorizzare correttamente il valore corretto e stampare (per ricontrollare) sullo schermo?

Grazie in anticipo.


La risposta sopra suggerisce di cambiare la funzione in eco dei dati piuttosto che di restituirli in modo che possano essere catturati.

Per una funzione o un programma che non è possibile modificare in cui il valore di ritorno deve essere salvato su una variabile (come test / [ , che restituisce un valore di successo 0/1, echo $? all'interno della sostituzione di comando:

# 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-$?)))"

Per esempio

$ 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

Per un programma che stampa dati ma ha anche un valore di ritorno da salvare, il valore di ritorno verrebbe catturato separatamente dall'output:

# 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

Usa la variabile speciale bash "$?" così:

function_output=${my_function}
function_return_value=$?

È dovuto alle dichiarazioni di echo . È possibile passare i tuoi echi alle stampe e tornare con un echo . Qui sotto funziona

#!/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

Cambia questa linea:

return $value

come questo:

echo $value

Quindi puoi catturare l'output.


È facile che tu risponda al valore che devi restituire e quindi catturarlo come di seguito

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

val=$(demofunc)
echo $val

Ancora un altro approccio ...

> H="Hello "
> U="$H""universe."
> echo $U
Hello universe.

... e ancora un altro

> H="Hello "
> U=$H"universe."
> echo $U
Hello universe.




linux bash