Bash脚本输入一组数字并将它们传递给其他函数

时间:2013-09-27 17:16:39

标签: bash shell scripting ssh

该程序应该调用第一个函数,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

3 个答案:

答案 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

注意:

  • 确保您的tmpdir存在
  • 变量0
  • 的播种效果不佳
  • 使用数组存储数字列表
  • 提供了一种打破输入循环的方法
  • 在bash中,==中的[[ ... ]]运算符是模式匹配运算符。
  • 你实际上并没有在任何地方使用你的函数返回值,所以我删除了它们
  • 声明一个函数,你不需要同时使用“function”关键字和括号
  • 使用read -p提供提示
  • 更广泛地使用算术表达
  • 分配变量,请勿在左侧使用$
  • 要获取该值,您必须使用$
  • 让系统使用大写变量名,例如,您不想意外覆盖PATH。
  • 避免编写临时文件,除非您确实需要它们(用于记录或审核)
  • printf重新使用格式字符串,直到消耗掉所有参数。这对于打印数组的内容非常方便。
  • 分号是可选的

答案 1 :(得分:1)

  1. 您应该将VARPRODUCTEVENS初始化为1,因为将任何内容乘以0都会产生0。
  2. $不应放在赋值语句中赋值的变量之前。
  3. 您可以使用-p选项read来指定提示
  4. 循环完成后,您正在写$$.tempnumbers将为空,因此您不会向文件写任何内容。如果要记录输入的所有数字,则必须在循环内执行此操作,并使用>>附加到文件而不是覆盖它。
  5. 没有理由在你的函数中使用return - 没有测试退出状态。非零通常用于表示存在错误。
  6. 您定义了一个函数reduce来打印结果,但从未调用过它
  7. 您需要将$放在所有echo行的变量名称前面。
  8. 不要将function放在函数定义之前;它是允许的,但不是必需的,也不是可移植的(它是bash扩展名)。
  9. #! /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的值)。

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

您的退货声明是不必要的,可能没有按照您的意图行事。您基本上是设置退出状态,非零意味着失败。