【发布时间】:2019-02-23 02:50:55
【问题描述】:
我试图弄清楚如何在同一个 bash 脚本中将一个函数调用的参数从一个函数传递到另一个函数。这是我到目前为止所得到的:
#!/usr/bin/env bash
# File: nevens.sh
function isiteven {
if (( "$element%2"=="0" ))
then
echo 1
fi
}
function nevens {
local result=0
for element in $@
do
if (( $(isiteven) == 1 )) # $(isiteven "$element")
then
result=$result+1
fi
done
echo $result
}
我尝试在 isiteven 函数中调用 $(isiteven) 并在 %2==0 前面硬编码 $element。我已经尝试通过函数调用传递参数,$(isiteven $element) 或 $(isiteven "$element"),但是我不确定我应该在 %2==0 前面编写什么代码来进行数学运算。
我在专用机器上使用 Ubuntu 18.04。
【问题讨论】:
-
顺便说一句,如果你定义了
isiteven() { (( ( $1 % 2 ) == 0 )); },那么你可以写if isiteven "$element"; then。这是因为函数的默认返回值为$?,而if在返回值上分支。这远比让你的函数写入标准输出,然后需要通过使用子外壳来捕获标准输出(因此需要 FIFO 设置和一个 fork 来创建子外壳)更有效。 -
...查看在ideone.com/mQgodw运行的代码
-
@CharlesDuffy 你甚至可以使用
isiteven() (( $1%2 == 0 ))。 -
@KarlBaker 这是因为函数体是一个复合命令,其中包括条件构造(参见this article)。虽然要知道一个巧妙的花絮,但我认为在任何环境中使用它是不可取的,因为在任何环境中,除了您之外的任何人都会查看您的 shell 代码,因为广大大多数人会感到困惑,而且它真的只节省了几次击键。
-
@KarlBaker 是的,您上面的描述是准确的。 (有一些小问题——严格来说,
$?是一个特殊的参数,而不是变量——但你描述的所有重要方面都是正确的)。涉及到一点魔法:对于 UNIX 退出代码(存储在$?中),0 为真,所有其他数字为假(这就是为什么exit 1或return 1用于脚本中的错误),但在算术上下文 0 为假,所有正整数为真。这在(( ))如何将其数字结果转换为 UNIX 退出代码中得到了解决:(( 1 ))将$?设置为 0,反之亦然。