1:找不到命令

时间:2011-11-03 21:25:51

标签: bash variables numbers set sh

我正在Bash中编写一个divides-by-three函数,它不允许我将变量设置为数字。

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

3 个答案:

答案 0 :(得分:4)

Bash函数通常通过将值打印到标准输出来“返回”值,调用者可以使用

来捕获它们。
`func args ...`

$(func args ...)

这使得函数像外部命令一样工作。

另一方面,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。在调用要通过#!/usr/bin/env找到的解释器(例如perl)时,通常会使用$PATH技巧。但在这种情况下,sh总是/bin/sh中(如果不是,系统会以各种方式中断)。编写#!/usr/bin/env sh的唯一原因是,如果您想使用sh中首先出现的$PATH命令,而不是标准命令。即使在这种情况下,您最好直接指定sh的路径。

答案 1 :(得分:2)

 d=div3 1

行是罪魁祸首,因为你将字符串div3分配给env变量d并尝试执行1.为避免这种情况,请使用反引号来分配评估结果:

 d=`div3 1`

然后,评估函数中出现另一个错误。您需要对参数运行测试,而不是尝试将它们作为命令进行评估:

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

仍然没有输出,但也没有错误。实际上你的预期产量是多少?

答案 2 :(得分:1)

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

d=$(div3 1)
rc=$?

echo $d
echo $rc


(blank line)
0

注意,返回只设置$的值?为功能 要返回值,只需打印它。

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