0

This program is supposed to call the first function, read-series and then pass the input of every iteration of the while loop to the even-odds function which would tell if the number was even or odd and make VARSUMODDS=the value of VARSUMODDS+input if it was odd or make VARPRODUCTEVENS=the value of VARSUMEVENS*input. Then it would print them out. I'm sure there are a thousand syntax errors here, so please, be brutal. Keep in mind that I just started learning this language and I just came to it knowing only C++ and Java a few days ago, so don't expect me to understand complex answers. Thanks!

#! /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
4

3 回答 3

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

笔记:

  • 确保您的 tmpdir 存在
  • 用 0 播种你的产品变量不好
  • 使用数组来存储数字列表
  • 提供一种打破输入循环的方法
  • 在 bash 中,其中的==运算符[[ ... ]]是模式匹配运算符。
  • 你实际上并没有在任何地方使用你的函数返回值,所以我删除了它们
  • 要声明一个函数,您不需要同时使用“function”关键字和括号
  • 用于read -p提供提示
  • 更广泛地使用算术表达式
  • 分配一个变量,不要$在左侧使用。
  • 要获得价值,您必须使用$
  • 让系统使用大写变量名,例如,您不想意外覆盖 PATH。
  • 避免编写临时文件,除非你真的需要它们(用于日志记录或审计)
  • printf 重复使用格式字符串,直到所有参数都被使用。这对于打印数组的内容非常方便。
  • 分号是可选的
于 2013-09-27T17:40:28.367 回答
1
  1. 你应该初始化VARPRODUCTEVENS为 1,因为任何东西乘以 0 都会产生 0。
  2. $不应放在赋值语句中被赋值的变量之前。
  3. 您可以使用该-p选项read来指定提示
  4. 您在$$.temp循环完成后写入。numbers那时将为空,因此您不会向文件写入任何内容。如果要记录输入的所有数字,则必须在循环内执行此操作,并使用>>追加到文件而不是覆盖它。
  5. 没有理由return在您的函数中使用 - 没有任何东西测试退出状态。非零通常用于表示存在错误。
  6. 您定义了一个函数reduce来打印结果,但从未调用它
  7. 您需要$在所有行的变量名之前放置echo
  8. 不要放在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
于 2013-09-27T17:38:00.090 回答
1

如果你单独运行这个脚本,你必须用 CTRL-d 结束你的输入。以下是问题:

VARPRODUCTEVENS=0 

必须

VARPRODUCTEVENS=1

否则您的产品将永远为零。

echo numbers > $TMPDIR/$$.temp

似乎没有什么有用的目的。您正在将字符串“数字”放入文件中。如果您使用 $numbers 它似乎仍然没有任何目的。您会将读取的最后一个数字放入文件中。从使用上看,“数字”可能是比“数字”更好的名字

    $VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))

    $VARSUMODDS=$(($VARSUMODDS + $1))

必须

    VARPRODUCTEVENS=$(($VARPRODUCTEVENS * $1))

    VARSUMODDS=$(($VARSUMODDS + $1))

在赋值左侧有 $VARSUMODDS 将尝试赋值给名为“1”的变量($VARSUMODDS 的值)。

没有减少的调用,所以你看不到任何结果。我假设你最后想要那个。

您的 return 语句是不必要的,并且可能没有按照您的意图进行。您基本上是在设置退出状态,非零意味着失败。

于 2013-09-27T18:09:01.383 回答