2011-11-03 49 views
3

我在Bash中寫了一個三分的函數,它不會讓我爲一個數字設置一個變量。1:找不到命令

fizzy.sh:

#!/usr/bin/env sh 

div3() { 
    return `$1 % 3 -eq 0` 
} 

d=div3 1 
echo $d 

例子:

$ ./fizzy.sh 
./fizzy.sh: line 7: 1: command not found 
+0

你的'div3'函數並沒有做你認爲它的功能。 –

+1

僅用於記錄/ google搜索者==>這裏不是這種情況,但是如果不小心在等號周圍添加了空格'd = div3 1'與正確的'd = div3',則會得到完全相同的錯誤1'。 –

回答

4

擊功能正常「返回」的值。

另一方面,return聲明設置的值爲$?。通常情況下,成功設置爲0,失敗1或者指定類型故障的其他值。把它看作是一個狀態碼,而不是一個普通的值。這可能是因爲這隻會從0支持值255

試試這個:

#!/bin/sh 

div3() { 
    expr $1 % 3 = 0 # prints "0" or "1" 
} 

d=$(div3 1) 
echo $d 

請注意,我也改變了shebang line#!/usr/bin/env sh#!/bin/sh。在調用您想要通過$PATH定位的解釋器(例如perl)時,經常使用#!/usr/bin/env技巧。但在這種情況下,sh總是/bin/sh(如果不是,系統將以各種方式中斷)。編寫#!/usr/bin/env sh的唯一原因是,如果您想使用任何sh命令碰巧首先出現在您的$PATH中,而不是標準的。即使在這種情況下,您可能更願意直接指定到sh的路徑。

2

d=div3 1 

行是罪魁禍首,因爲您指定的字符串DIV3到環境變量d,並嘗試執行1.爲了避免這種情況,請使用反引號來指定評估結果:

d=`div3 1` 

然後,您的評估函數發生另一個錯誤。您需要在您的參數運行,而不是試圖評價其命令測試:

return `test $(($1 % 3)) -eq 0` 

仍然沒有輸出,但沒有任何錯誤。實際上你預期的產出會是多少?

+0

@MattBall:我也是這麼做的,那裏有一個蒙面的錯誤。編輯,謝謝。 – thiton

1
div3() { 
    return $((($1 % 3) == 0)) 
} 

d=$(div3 1) 
rc=$? 

echo $d 
echo $rc 


(blank line) 
0 

注意,return只是設置$的值?功能 返回值,只需打印它。通過將它們印刷到標準輸出,其中,所述主叫方可以使用

`func args ...` 

$(func args ...) 

這使得功能工作狀的外部命令捕捉它們

div3() { 
    printf $((($1 % 3) == 0)) "\n" 
}