2011-11-03 45 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" 
}