2013-09-27 65 views
0

该程序应该调用第一个函数read-series,然后将while循环的每个迭代的输入传递给even-odds函数,告诉数字是偶数还是奇数,并且使VARSUMODDS = VARSUMODDS +输入的值(如果它是奇数)或使VARPRODUCTEVENS = VARSUMEVENS *输入的值。然后它会打印出来。我敢肯定,这里有一千个语法错误,所以请大胆,残忍。请记住,我刚开始学习这门语言,几天前我才知道只知道C++和Java,所以不要指望我理解复杂的答案。谢谢!Bash脚本输入一组数字并将它们传递给其他函数

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

回答

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 
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中突破输入循环
  • 的方式,[[ ... ]]中的==运算符是模式匹配运算符。
  • 你实际上并没有在任何地方使用你的函数的返回值,所以我删除他们
  • 声明函数,你不需要同时使用“功能”关键字和括号
  • 使用read -p提供提示
  • 使用更广泛的算术表达式
  • 要分配变量,请勿在左侧使用$
  • 来获取值,你必须使用$
  • 让系统使用大写变量名,你不想意外覆盖路径,例如。
  • 避免编写临时文件,除非您确实需要它们(用于日志记录或审计)
  • printf重新使用格式字符串,直到消耗完所有参数。这对于打印数组的内容非常方便。
  • 分号是可选的
+0

我从你的答案中学到了一些东西:我不知道你可以用'+ ='添加一个数组元素。 – Barmar

1

如果独立运行此脚本,你必须终止与CTRL-d的输入。这里有问题:

VARPRODUCTEVENS=0 

必须

VARPRODUCTEVENS=1 

或你的产品永远是零。

echo numbers > $TMPDIR/$$.temp 

似乎没有用处。您将字符串“数字”放入文件中。如果您使用$数字,它似乎仍然没有用处。您将把读取的单个最后一个数字放入文件中。从使用 “数量” 可能是一个更好的名字不是 “数字”

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

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

必须

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

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

有$作业左侧的VARSUMODDS将尝试t o分配给名为“1”的变量($ VARSUMODDS的值)。

有没有电话减少,所以你看不到任何结果。我想你最后想要的。

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

相关问题