在bash中,如何在变量中存储返回值?

its*_*tsh 36 linux bash

我知道Linux中的一些非常基本的命令,我正在尝试编写一些脚本.我编写了一个函数,用于计算5位数字中最后2位数的总和.该函数应该在最后的2位数之间连接这个结果和并返回它.我想要返回此值的原因是因为我将在另一个函数中使用此值.

例如:如果我有12345,那么我的函数将计算4 + 5并返回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
Run Code Online (Sandbox Code Playgroud)

我试图回声并看到结果,但我得到的输出如下所示.

-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
Run Code Online (Sandbox Code Playgroud)

我还尝试将结果打印为:

password_formula
RESULT=$?
echo $RESULT
Run Code Online (Sandbox Code Playgroud)

但这给了一些未知的价值:

++ RESULT=67
++ echo 67
67
Run Code Online (Sandbox Code Playgroud)

如何正确存储正确的值并在屏幕上打印(进行双重检查)?

提前致谢.

tha*_*guy 25

返回值(又名退出代码)是0到255(包括0和255)范围内的值.它用于表示成功或失败,而不是返回信息.超出此范围的任何值都将被包装.

要返回信息,例如您的号码,请使用

echo "$value"
Run Code Online (Sandbox Code Playgroud)

要打印您不想捕获的其他信息,请使用

echo "my irrelevant info" >&2 
Run Code Online (Sandbox Code Playgroud)

最后,要捕获它,使用你所做的:

 result=$(password_formula)
Run Code Online (Sandbox Code Playgroud)

换一种说法:

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"
Run Code Online (Sandbox Code Playgroud)


小智 14

最简单的答案:

函数的返回码只能是0到255之间的值。要将这个值存储在变量中,您必须像本例一样:

#!/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
Run Code Online (Sandbox Code Playgroud)

  • 这是这里唯一正确的答案。将函数从 return 更改为 echo 的最受好评的答案可能适用于这种特定情况,但当然不是这里大多数读者想要的答案。 (2认同)

Yts*_*oer 9

使用特殊的 bash 变量“$?” 像这样:

function_output=$(my_function)
function_return_value=$?
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是`$(my_function)`,而不是`${my_function}`,对吗? (3认同)

Cal*_*pau 6

上面的答案建议将函数更改为回显数据而不是返回数据,以便可以捕获数据。

对于无法修改返回值需要保存到变量的函数或程序(例如test/ [,它返回 0/1 成功值),请$?在命令替换中 echo:

# 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-$?)))"
Run Code Online (Sandbox Code Playgroud)

例如

$ 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
Run Code Online (Sandbox Code Playgroud)

对于打印数据但也有要保存的返回值的程序,返回值将与输出分开捕获:

# 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
Run Code Online (Sandbox Code Playgroud)


ima*_*era 6

您需要回显返回所需的值,然后像下面一样捕获它

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

val=$(demofunc)
echo $val
Run Code Online (Sandbox Code Playgroud)

  • 如果你在 `echo $variable` 之前添加 `echo 555` 或类似的东西,这将与不好的 `$variable` 连接 (2认同)