在bash中,如何在一个variables中存储返回值?

我知道Linux中的一些非常基本的命令,并且正在尝试编写一些脚本。 我写了一个函数,用5位数字来计算最后两位数的总和。 该函数应该在最后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 

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

 -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 

我也尝试打印结果如下:

 password_formula RESULT=$? echo $RESULT 

但那是一个未知的价值:

 ++ RESULT=67 ++ echo 67 67 

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

提前致谢。

Solutions Collecting From Web of "在bash中,如何在一个variables中存储返回值?"

改变这一行:

 return $value 

喜欢这个:

 echo $value 

然后你可以捕捉它的输出。

返回值(又名退出代码)是一个介于0到255之间的值。 它用来表示成功或失败,而不是返回信息。 超出此范围的任何值都将被打包。

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

 echo "$value" 

要打印您不想捕获的附加信息,请使用

 echo "my irrelevant info" >&2 

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

  result=$(password_formula) 

换一种说法:

 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" 

上面的答案建议改变函数来回显数据,而不是返回,以便它可以被捕获。

对于不能修改返回值需要保存到变量(如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-$?)))" 

例如

 $ 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 

对于打印数据的程序,还有要保存的返回值,返回值将从输出中分别捕获:

 # 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 

最简单的答案:

函数的返回码只能是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 

你很容易回声你需要返回的值,然后像下面捕获它

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

这是由于echo陈述。 你可以把你的回声打印出来,并用echo返回。 下面的作品

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

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

 function_output=${my_function} function_return_value=$?