【问题标题】:Bash script to input a group of numbers and pass them to other functions用于输入一组数字并将它们传递给其他函数的 Bash 脚本
【发布时间】:2013-10-04 02:11:51
【问题描述】:

这个程序应该调用第一个函数,read-series,然后将 while 循环的每次迭代的输入传递给 even-odds 函数,该函数将判断数字是偶数还是奇数,并使 VARSUMODDS=值VARSUMODDS+input 如果它是奇数,或者使 VARPRODUCTEVENS=VARSUMODDS*input 的值。然后它会将它们打印出来。我敢肯定这里有一千个语法错误,所以请粗暴一点。请记住,我刚开始学习这门语言,几天前我只知道 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

【问题讨论】:

    标签: bash shell scripting ssh


    【解决方案1】:
    #! /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 播种 product 变量不好
    • 使用数组来存储数字列表
    • 提供一种打破输入循环的方法
    • 在 bash 中,[[ ... ]] 中的 == 运算符是一个模式匹配运算符。
    • 你实际上并没有在任何地方使用你的函数返回值,所以我删除了它们
    • 要声明一个函数,您不需要同时使用“function”关键字和括号
    • 使用read -p提供提示
    • 更广泛地使用算术表达式
    • 要分配变量,不要在左侧使用$
    • 要获取值,必须使用$
    • 让系统使用大写的变量名,例如,您不想意外覆盖 PATH。
    • 避免编写临时文件,除非您确实需要它们(用于日志记录或审计)
    • printf 重复使用格式字符串,直到所有参数都用完。这对于打印数组的内容非常方便。
    • 分号是可选的

    【讨论】:

    • 我从您的回答中学到了一些东西:我不知道您可以使用+= 添加数组元素。
    【解决方案2】:
    1. 您应该将VARPRODUCTEVENS 初始化为 1,因为任何东西乘以 0 都会产生 0。
    2. $ 不应放在赋值语句中要赋值的变量之前。
    3. 您可以使用-p 选项对read 指定提示
    4. 循环完成后,您正在写信给$$.tempnumbers 将是空的,因此您不会向文件写入任何内容。如果您想记录所有输入的数字,您必须在循环中执行此操作,并使用>> 附加到文件而不是覆盖它。
    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
    

    【讨论】:

      【解决方案3】:

      如果你单独运行这个脚本,你必须用 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 的值)。

      没有调用 reduce,因此您看不到任何结果。我假设你最后想要那个。

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

      【讨论】:

        猜你喜欢
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 2021-07-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        相关资源
        最近更新 更多