2013-12-08 128 views
0

我被困在這個shell腳本代碼中,它需要用戶輸入組號碼,並找到該組號碼中最大和最大的平均值。 我的代碼ATM只適用於將組號作爲命令行參數傳遞。如何提示用戶輸入的組號?Shell腳本讀取用戶輸入

read n 

    if [ $n -ge 1 ]; then 

    sum=0 

    count=$n 

    max=-1000 
    if [ $max -lt $1 ]; then 

    max=$1 

    fi 

    while [ $n -ge 1 ]; do 

      case $1 in 
      [0-9] | [1-9][0-9]) 
      sum=`expr $sum +$1`;; 
      -[1-9] | -[1-9][0-9]) 
      sum=`expr $sum + $1`;; 


    done 

    if [ $count -gt 0 ]; then 

    avg=`expr $sum/$count` 

    echo The largest number is $max 

    echo The average number is $avg 
+0

那麼,你有什麼嘗試?你已經知道你可以使用'read',顯示你如何使用它,所以我們可以幫你修復它。請僅發佈必要的代碼 - 圍繞您如何嘗試做到這一點的兩三條線就足夠了。請[編輯]你的問題來證明這一點。 – Mat

+0

感謝您的評論..我真的很抱歉因爲我還是新來這..我編輯了我的代碼.. BT仍然不知道..如何閱讀命令真的工作..感謝 – user3079769

回答

0

你工作太辛苦了,你的腳本太冗長了。嘗試:

#!/bin/sh 

test $# -gt 0 || { echo Please enter at least one argument >&2; exit 1; } 
max=0 
for x; do 
    test "$max" -lt $x && max=$x 
    test $? -gt 1 && exit 1 
    : $((count += 1)) 
    : $((sum += x)) 
done 

echo max = $max 
printf "avg = " 
expr $sum/$count 

既然你在你的腳本中使用expr,我做的是相同的,但要注意,所有的運算都將在整數來完成(所以報告的平均將小於的最大整數實際平均值和非整數輸入將被視爲錯誤)。該解決方案依賴於test返回一個大於1的值,當它遇到一個錯誤(例如,非整數輸入),它是由 the open group.

指定的行爲還要注意,這使錯誤消息上stderr(其中錯誤消息屬於)並返回一個非零值以指示腳本失敗。

2

從您的意見看來,你似乎想從stdin而不是從命令行讀取值。要做到這一點在Bash中使用read內置:

read -ep "Enter group number: " group 
printf "Entered %d\n" $group 

對於交互式促使它通常放在一個while循環,你可以打破的測試部分,如果輸入無效:

shopt -s extglob 
while read -ep "Enter group number: " group; do 
    case $group in 
     ?(-)+([0-9])) # valid input 
      # compute average here 
     *) break ;;  # not valid input 
    esac 
done 

有關更多信息,請參閱help read

+0

這有助於很多感謝您的評論 – user3079769

+0

@ user3079769好。現在,您可能想上傳 - 甚至接受 - 您認爲有用的答案或解決問題的答案。這就是它在stackexchange網站上的工作原理。如果你仍然有問題,你應該用新的信息編輯你的原始問題。 – 2013-12-09 19:07:01