Сбой нескольких условий в цикле while из-за типа ввода в Bash, или требуется условие трехзначного числа - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь контролировать пользовательский ввод в сценарий, чтобы можно было передать только трехзначное число.Я начал с двух if, и они отлично работают.

echo -e "Input sequence number:"
read SEQUENCE

NUMTEST='^[0-9]+$'
if ! [[ $SEQUENCE =~ $NUMTEST ]]; then
    echo "ERROR:" "$SEQUENCE" "is not a number! Try again!"
    exit 1
fi

SEQLEN=$(printf "%s" "$SEQUENCE" | wc -c)  
if (($SEQLEN != 3)); then
    echo "ERROR:" "$SEQUENCE" "is not a 3 digit number! Try again!"
    exit 1
fi

Лучше было бы использовать цикл while, чтобы пользователю не приходилось повторять скрипт, но пока я могу получитьЦикл while работает для каждого отдельного условия, когда я объединяю их, текстовый ввод убивает цикл, поскольку числовому условию это не нравится.

echo -e "Input sequence number:"
read SEQUENCE

NUMTEST='^[0-9]+$'
SEQLEN=$(printf "%s" "$SEQUENCE" | wc -c)

while ! [[ $SEQUENCE =~ $NUMTEST ]] && (($SEQLEN != 3)); do
    echo "ERROR:" "$SEQUENCE" "is not a 3 digit number! Try again!"
    echo -e "Input sequence number:"
    read SEQUENCE    
    SEQLEN=$(printf "%s" "$SEQUENCE" | wc -c)
done

Я думаю, либо мне нужно создать одно условие$ SEQUENCE == Трехзначное число или найти способ подавления ошибок, чтобы любая ошибка означала, что цикл продолжается.

Чтобы быть в явном виде, мои вопросы:

  • Есть ли способнаписать условие $ SEQUENCE == 3-значное число?
  • Могу ли я устранить ошибку и все же перейти к циклу, или это ошибка завершения сценария?

Предложения и улучшенияочень признателен.Это мой первый сценарий, поэтому я не удивлюсь, если я совершу некоторые плохие практики, поэтому любые другие рекомендации приветствуются.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Разве вы не имеете в виду:

while ! [[ $SEQUENCE =~ $NUMTEST ]] || (($SEQLEN != 3)); do

Вам нужно повторить цикл, когда не число или не три цифры (что отличается от вашей конструкции, где вы цикл, когда не число и длина не3).

Кроме того, вы можете создать регулярное выражение для объединения трехзначных чисел, как указано в ответе @ Socowi.

0 голосов
/ 19 октября 2018

Есть ли способ написать условие $ SEQUENCE == 3-значный номер?

Да.Измените регулярное выражение на ^[0-9]{3}.

С помощью небольшого трюка вы также можете удалить дублированную обработку ввода:

while true; do
    read -p 'Input sequence number: ' sequence
    [[ "$sequence" =~ ^[0-9]{3}$ ]] && break
    echo "ERROR: '$sequence' is not a 3 digit number!"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...