2013-09-27 59 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的值)。

有沒有電話減少,所以你看不到任何結果。我想你最後想要的。

您的退貨聲明是不必要的,並且可能沒有按照您的預期進行。你基本上是設置退出狀態,非零意味着失敗。

相關問題