Shell脚本读取用户输入

时间:2013-12-08 12:18:22

标签: bash shell 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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(错误消息所在的位置)并返回非零值以指示脚本失败。