Прочтите N символов или нажмите Enter для выхода - PullRequest
0 голосов
/ 09 мая 2020

У меня есть следующая функция, и я хочу, чтобы когда я один раз нажимал клавишу ВВОД, запускался первый случай, а затем выходил. Теперь мне нужно нажать Enter 4 раза, чтобы выйти. Кроме того, когда я нажимаю только одно или два числа, а затем ввожу, сообщение «Число вне допустимого диапазона» отображается сразу, а не после двух или трех раз для каждого случая.

function MakeSomething () {
    while true; do
        echo -en "Input : "
        read -N4 vn
        echo
        case $vn in
            "") if [ -z "$vn" ] ; then vn=3000 ; echo ${vn} ; exit ; fi ; break ;;
             *) [[ $vn =~ ^[0-9]+$ ]] || { echo -e '\nSorry input a number between 0011 and 2559\n' ; continue; } 
             if ((vn >= 0011 && vn <= 2559)); then echo ${vn} ; else echo -e '\nNumber out of Range, input a number between 0011 and 2559\n' ; fi ; MakeSomething ;break
        esac
    done
}

1 Ответ

1 голос
/ 09 мая 2020

Сначала позвольте мне ответить на вашу проблему:

нажмите Enter 4 раза, чтобы выйти.

Это потому, что вы используете read -N4, что означает, что вы читаете четыре символа из ввода. Итак, вам нужно четыре Enter. Я предлагаю изменить его на -a, читать из ввода, пока Enter не исправит это.

Я нажимаю только одну или две цифры, а затем ввожу, чтобы отобразить сообщение «Номер вне диапазона» сразу, а не после двух или трех раз для каждого случая.

Я думаю, вам не следует вызывать функцию внутри предложения case, потому что вы уже используете while l oop. Следует просто позволить этому продолжаться.

Вот мой код: // работает

#!/bin/sh

function MakeSomething () {
while true; do
echo -en "Input : "
read -a vn
echo
case $vn in
    "") if [ -z "$vn" ] ; then vn=3000 ; echo ${vn} ; exit ; fi ; break ;;
     *) [[ $vn =~ ^[0-9]+$ ]] || { echo -e '\nSorry input a number between 0011 and 2559\n' ; continue; }
# check input len
          if [ ${#vn} -ge 5 ] || [ ${#vn} -le 3 ]; then echo '\n need exactly four number'; continue; fi 
     if ((vn >= 0011 && vn <= 2559)); then echo ${vn} ; else echo -e '\nNumber out of Range, input a number between 0011 and 2559\n' ; fi
esac
done
}

MakeSomething

...