#bash #scripting
#bash #сценарии
Вопрос:
Следующий сценарий bash принимает любые вводимые числа в диапазоне от 0 до 100 и выводит среднее значение чисел на экран. Сценарий также имеет проверку ввода, которая не допускает ничего, кроме числа от 0-100 до q или Q. Как только вы вводите q или Q, он вычисляет результаты и выводит на экран. Проверка ввода также проверяет, чтобы убедиться, что не введены нулевые значения, введены специальные символы и что не введены комбинации цифр / букв, специальные комбинации символов / цифр и т. Д.
Единственная проблема, с которой я сталкиваюсь, связана с символом обратной косой черты. Обратная косая черта экранируется в этом скрипте, и когда я запускаю скрипт и ввожу обратную косую черту, он приостанавливается и требует, чтобы вы нажали return для продолжения работы скрипта. Похоже, сценарий все еще работает, но мне любопытно, почему он останавливается. Большинство рекомендаций, которые я видел на этом сайте, заключались в том, чтобы избежать обратной косой черты с помощью большего количества обратных косых черт, но это не работает.
#! /bin/bash
AVERAGE="0"
SUM="0"
NUM="0"
clear
while true; do
echo -n "Enter your score [0-100%] ('q' for quit): "; read SCORE;
if [[ "$SCORE" == *[a-pA-pr-zR-Z]* ]] ||
[[ "$SCORE" == *['!'\@#$%^amp;*()_ ~`-=[]{}|:;'"<>,.?/\]* ]] ||
[[ -z "$SCORE" ]] ||
(( "$SCORE" < "0" )) || (( "$SCORE" > "100" ))
then
echo "Be serious. Come on, try again: "
elif [[ "$SCORE" == [qQ] ]]; then
echo "Average rating: $AVERAGE%."
break
else
SUM=$[$SUM $SCORE]
NUM=$[$NUM 1]
AVERAGE=$[$SUM / $NUM]
fi
done
echo "Exiting."
Комментарии:
1. кроме того, как мне также проверить наличие любой буквенно-цифровой записи и предложить им повторно ввести?
Ответ №1:
Используется read -r
для отключения экранирования обратной косой черты, которое включено по умолчанию.
Options:
-r do not allow backslashes to escape any characters
Комментарии:
1. благодаря read -r исправлена проблема с обратной косой чертой. теперь у меня есть еще одна проблема с вводом любого числа, за которым следует буква q, это нарушает сценарий.
2.
A-p
должно бытьA-P
.3. другими словами, как бы я заставил этот скрипт проверять буквенно-цифровую запись и заставить пользователя правильно ввести число?
4.
== [qQ]
Сначала поставьте проверку, а затем сделайте большоеif
утверждение. Затем вы можете упростить*[a-pA-pr-zR-Z]*
до*[a-zA-Z]*
.