2013-02-21 50 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=$? 
相關問題