簡體   English   中英

Shell腳本讀取用戶輸入

[英]Shell script read user input

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

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

從您的評論看來,您似乎想從stdin而不是從命令行讀取值。 要在Bash中執行此操作,請使用read builtin:

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

你的工作方式太難了,你的腳本太冗長了。 嘗試:

#!/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的值,這是由open組指定的行為

另請注意,這會將錯誤消息放在stderr (錯誤消息所屬的位置)上,並返回非零值以指示腳本失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM