该程序应该调用第一个函数,read-series,然后将while循环的每次迭代的输入传递给even-odds函数,该函数将判断数字是偶数还是奇数,并使VARSUMODDS =值VARSUMODDS +输入如果它是奇数或使VARPRODUCTEVENS = VARSUMEVENS *输入的值。然后它会打印出来。我确定这里有一千个语法错误,所以请尽可能地残忍。请记住,我刚刚开始学习这门语言,而且我刚刚在几天前只知道C ++和Java,所以不要指望我理解复杂的答案。谢谢!
#! /bin/bash
TMPDIR=${HOME}/tmpdir
echo "Enter an integer: "
VARSUMODDS=0
VARPRODUCTEVENS=0
function read-series() {
while read numbers ; do
echo "Enter an integer: "
even-odds $numbers
done
echo numbers > $TMPDIR/$$.temp
return 0;
}
function even-odds() {
evenp=$(( $1 % 2 ))
if [ $evenp -eq 0 ] ; then
$VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))
return 0;
else
$VARSUMODDS=$(($VARSUMODDS + $1))
return 1;
fi
}
function reduce () {
echo -n "Sum of odds: "
echo VARSUMODDS
echo -n "Product of evens: "
echo VARPRODUCTEVENS
return 0;
}
read-series
答案 0 :(得分:2)
#! /bin/bash
tmpdir=${HOME}/tmpdir
mkdir -p $tmpdir
odd_sum=0
even_product=1
numbers=()
read-series() {
while read -p "Enter an integer (q to quit): " number ; do
[[ $number == [Qq]* ]] && break
even-odds $number
numbers+=($number)
done
printf "%d\n" "${numbers[@]}" > $tmpdir/$$.temp
}
even-odds() {
if (( $1 % 2 == 0 )) ; then
(( even_product *= $1 ))
else
(( odd_sum += $1 ))
fi
}
reduce () {
echo "Sum of odds: $odd_sum"
echo "Product of evens: $even_product"
}
read-series
reduce
注意:
==
中的[[ ... ]]
运算符是模式匹配运算符。read -p
提供提示$
。$
答案 1 :(得分:1)
VARPRODUCTEVENS
初始化为1,因为将任何内容乘以0都会产生0。$
不应放在赋值语句中赋值的变量之前。-p
选项read
来指定提示$$.temp
。 numbers
将为空,因此您不会向文件写任何内容。如果要记录输入的所有数字,则必须在循环内执行此操作,并使用>>
附加到文件而不是覆盖它。return
- 没有测试退出状态。非零通常用于表示存在错误。reduce
来打印结果,但从未调用过它$
放在所有echo
行的变量名称前面。function
放在函数定义之前;它是允许的,但不是必需的,也不是可移植的(它是bash扩展名)。#! /bin/bash
TMPDIR=${HOME}/tmpdir
VARSUMODDS=0
VARPRODUCTEVENS=1
read-series() {
while read -p "Enter an integer: " numbers ; do
even-odds $numbers
echo $numbers >> $TMPDIR/$$.temp
done
}
even-odds() {
evenp=$(( $1 % 2 ))
if [ $evenp -eq 0 ] ; then
VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))
else
VARSUMODDS=$(($VARSUMODDS + $1))
fi
}
reduce () {
echo ''
echo -n "Sum of odds: "
echo $VARSUMODDS
echo -n "Product of evens: "
echo $VARPRODUCTEVENS
}
read-series
reduce
答案 2 :(得分:1)
如果您独立运行此脚本,则必须使用CTRL-d结束输入。以下是问题:
VARPRODUCTEVENS=0
必须是
VARPRODUCTEVENS=1
或您的产品将始终为零。
echo numbers > $TMPDIR/$$.temp
似乎没有用处。您将字符串“numbers”放入文件中。如果你使用$ number,它似乎仍然没有用处。您将把读取的最后一个数字放入文件中。从使用“数字”可能是一个比“数字”更好的名称
$VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))
和
$VARSUMODDS=$(($VARSUMODDS + $1))
必须是
VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))
和
VARSUMODDS=$(($VARSUMODDS + $1))
在赋值左侧有$ VARSUMODDS将尝试分配名为“1”的变量($ VARSUMODDS的值)。
没有减少的调用,所以你看不到任何结果。我假设你最后想要那个。
您的退货声明是不必要的,可能没有按照您的意图行事。您基本上是设置退出状态,非零意味着失败。