Попытка избежать обратной косой черты в этом сценарии bash

#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]* .