我正在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
答案 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"
}