2013-12-08 3 views
0

Я застрял в этом коде сценария оболочки, где он требует, чтобы пользователь вводил номер группы и находил наибольшее и среднее значение из этого номера группы. Мой код 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 
+0

Ну, что вы пробовали? Вы уже знаете, что можете использовать 'read', показать, как вы пытались его использовать, чтобы мы могли помочь вам исправить это. Пожалуйста, разместите только необходимый код - достаточно двух или трех строк вокруг того, как вы пытаетесь сделать это. Пожалуйста, отредактируйте свой вопрос, чтобы показать это. – Mat

+0

Спасибо за комментарий ур .. и мне очень жаль, потому что я все еще новичок в этом .. я редактировал мой код .. bt все еще не уверен ... так что команда чтения действительно работает..thanks – 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. Если у вас все еще есть проблемы, вы должны отредактировать исходный вопрос с новой информацией. –

Смежные вопросы