2013-02-21 49 views
20

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

例如:如果我有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 

我怎样才能正确地存储正确的值,并打印(以双重检查)在屏幕上?

在此先感谢。

+0

这里使用反引号似乎不合适。你可以做'first = $ {last_two:0:1}'和'second = $ {last_two:1:1}',或'first = $ {last_two%?}'和'second = $ {last_two#?} ' – 2013-02-21 23:18:24

+0

“返回”语句对于那些习惯了高级语言的人来说是误导性的 - 更好的名字可能是“exit_status”。如果你想返回一个由字符串值或数值大于255组成的结果,那么它必须通过“回声”或其他输出到标准输出的方式完成。 – MikeW 2018-02-19 14:38:40

回答

4

改变这一行:

return $value 

这样的:

echo $value 

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

+0

对我没用,我的函数确实返回'0'或'1' *和*在stdout上打印一些东西。我只需要这个号码。 – 2015-04-21 19:17:39

+0

@TomášZato,这不适用于0或1秒或打印。如果你需要一个号码只是回显号码。 – perreal 2015-04-22 03:42:37

+0

你还没有得到它,是吗?尝试更多:我需要*打印数据* **和** *返回一个数字*。有时我可能会使用数据(使用'$()'符号),有时我需要检查返回值。 – 2015-04-22 10:41:34

18

返回值(又名退出代码)是一个介于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" 
+0

问题是我需要使用stdout而不是stderr。 – 2015-04-21 19:18:27

1

这是由于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 
+0

非常感谢所有人的详细解释。它现在有效。 – itsh 2013-02-21 22:59:18

+0

问题是如何获得**返回值**,而不是'echo'ed值。 – 2015-04-21 19:28:09

3

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

对于函数或程序不能修改其中的返回值需要被保存到一个变量(如test/[,它返回一个成功0/1值),回声$?命令替换内:

# 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 
3

简单的答案:

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

这是很容易,你需要回应,你需要像下面

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

val=$(demofunc) 
echo $val 
+1

这应该是被接受的答案。目前的语法是不完整和不正确的语法。 – Buffalo 2017-04-10 07:26:24

+0

我同意。这是最容易使用的。 – 2018-01-09 00:54:01

+0

如果在'echo $ variable'之前添加'echo 555'或其他类似的东西,这将会与'$ variable'连接,这是不好的 – Groosha 2018-02-06 16:48:56

0

返回,然后捕获它的价值使用特殊的bash变量“$?”像这样:

function_output=${my_function} 
function_return_value=$? 
相关问题