命令未找到。

3
我是一名有用的助手,可以为您翻译文本。以下是需要翻译的内容:

我在Bash中编写一个能够将数字除以三的函数,但是它不允许我将变量设置为一个数字。

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

你的 div3 函数并不像你想的那样运行。 - Matt Ball
1
仅供记录/谷歌搜索者==>这里不是这种情况,但如果您在等号周围意外添加空格,例如d = div3 1而不是正确的d=div3 1,您将得到完全相同的错误。 - Peter Ajtai
3个回答

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行#!/usr/bin/env sh更改为#!/bin/sh。在调用解释器(如perl)时,通常会使用#!/usr/bin/env技巧,以便您可以通过$PATH找到它。但是,在这种情况下,sh将始终存在于/bin/sh中(如果不存在,系统将以各种方式出现故障)。编写#!/usr/bin/env sh的唯一原因是,如果您想要使用出现在$PATH中的任何sh命令而不是标准命令,则可以这样做。即使在这种情况下,直接指定sh的路径也可能更好。

2

The

 d=div3 1

line是元凶,因为您将字符串div3分配给环境变量d并尝试执行1。为避免此问题,请使用反引号(`)来赋值求值结果:

 d=`div3 1`

接着,在你的评估函数中又出现了一个错误。你需要对参数进行测试,而不是尝试将其作为命令进行评估:

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

仍然没有输出,但也没有错误。实际上,您期望的输出是什么?


@MattBall:我也是,那里有一个掩码错误。已编辑,谢谢。 - thiton

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

d=$(div3 1)
rc=$?

echo $d
echo $rc


(blank line)
0

注意,return语句只是为了设置函数的返回值,要返回值,只需将其打印出来即可。
div3() {
    printf $(( ( $1 % 3 ) == 0 )) "\n"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接