对于作业,我必须编写一个函数,当提供一系列数字时打印偶数的数量。
我使用了我用于之前分配的一段代码(1
当数字是偶数和0
奇数时打印)
我现在的问题是我的功能一直在打印0
。我究竟做错了什么?
这是我的脚本:
#!/usr/bin/bash
# File: nevens.sh
# Write a function called nevens which prints the number of even numbers when provided with a sequence of numbers.
# Check: input nevens 42 6 7 9 33 = output 2
function nevens {
local sum=0
for element in $@
do
let evencheck=$(( $# % 2 ))
if [[ $evencheck -eq 0 ]]
then
let sum=$sum+1
fi
done
echo $sum
}
您只是忘记在循环
$#
中用 ($
)替换:element
for
现在来测试功能:
@dessert找到了核心问题,我来做一些代码审查:
/usr/bin/bash
在 Ubuntu 中没有。是/bin/bash
。很好,您声明
sum
local
了 ,并避免污染函数外部的变量命名空间。-i
此外,您可以使用以下选项将其声明为整数变量:总是引用你的变量(和参数)!在这个脚本中这不是必需的,但要养成一个非常好的习惯:
也就是说,你可以省略
in "$@"
这里:如果
in <something>
未给出,则for
循环隐式循环参数。这样可以避免忘记引号等错误。无需计算然后检查结果。您可以直接在 中进行计算
if
:(( ... ))
是算术上下文。它比[[ ... ]]
执行算术检查更有用,另外你可以省略$
之前的变量(这使得它更容易阅读,恕我直言)。如果将偶数检查部分移到单独的函数中,它可能会提高可读性和可重用性:
我不确定您是否愿意接受其他解决方案。另外,我不知道您是否可以使用外部实用程序,或者您是否仅限于 bash 内置程序。例如,如果您可以使用
grep
,您的功能可能会简单得多:这会将每个输入整数放在自己的行上,然后用于
grep
计算以偶数结尾的行。更新 - @PeterCordes 指出我们甚至可以在没有 grep 的情况下执行此操作 - 只需纯 bash,只要输入列表只包含格式良好的整数(没有小数点):
这通过创建一个
evens
通过过滤掉所有赔率调用的列表来工作,然后返回该列表的长度。