2017-02-07 4 views
0

По какой-то причине я не получаю шаблоны с более высокими номерами для работы в этом скрипте.Сценарий оболочки с ошибкой шаблона корпуса

#!/bin/bash 
# 
# guess_my_number.bash - my favorite number 

echo "Can you guess my favorite number???" 

echo -e -n "\n\n\033[32m Pick a number between 0 and 100 > " 
read num 
case $num in 

    [0-6])    echo "You're close...but too low" ;; 
    [8-14])    echo "You're close...but too high" ;; 
    [15-100])   echo "You're nowhere near my favorite number...sorry, try again" ;; 
    7)     echo "YOU GUESSED MY FAVORITE NUMBER!" ;; 
    *)     echo "You didn't pick a number between 1 and 100!" ;; 

esac 

Если я изменяю [8-14] на [8..14] Я получаю эхо-ответ, если я типа в 8 при запуске скрипта, но любое другое число от 9-100 дает мне подстановочному эхо-ответ , Если это [8-14], это также дает мне ответ на шаблон. Как я сказал, шаблон [0-6] дает его эхо-инструкцию, а также 7.

В чем моя проблема?

+2

Возможный дубликат [Использование Case для Диапазон Numbe rs в Bash] (http://stackoverflow.com/questions/12614011/using-case-for-range-of-numbers-in-bash) –

+0

Возможный дубликат [Регулярные выражения в выражении случая Bash] (http://stackoverflow.com/questions/9631335/regular-expressions-in-a-bash-case-statement) – codeforester

+0

hmm ... thanx, но я не уверен, что я понимаю эти другие вопросы. – user7526725

ответ

0

Как указано в других ссылках, корпус может выполнять только сопоставление образцов, а не расширение арифметики. Это означает, что вы можете использовать диапазон в [0-6], для которого регулярное выражение будет соответствовать любому одиночному символу в диапазоне 0-6, но диапазон [8-14] не является допустимым шаблоном.

Если вы настаиваете идти с футляром, то ваш пример должен выглядеть так:

case $num in 
    ([0-6])     echo "You're close...but too low" ;; 
    ([8-9]|1[0-4])   echo "You're close...but too high" ;; 
    (1[5-9]|[2-9][0-9]|100) echo "You're nowhere near my favorite number...sorry, try again" ;; 
    7)      echo "YOU GUESSED MY FAVORITE NUMBER!" ;; 
    *)      echo "You didn't pick a number between 1 and 100!" ;; 
esac 

Узор (1 [5-9] | [2-9] [0-9] | 100) регулярное выражение говорящие средства:

1[5-9] : 15-16-17-18-29 
[2-9][0-9] : Each number of first [] with one number of second [] = range 20-99 
100 : Literally 100 
PS: The | is used as OR operator. 

из-за этого случая поведения, для сравнения чисел использования, если-то-иначе является предпочтительным:

if [ "$num" -ge 0 ] && [ "$num" -le 6 ]; then 
    echo "...." 
elif [ "$num" -ge 8 ] && [ "$num" -le 14 ]; then 
    echo "...." 
elif [ "$num" -ge 15 ] && [ "$num" -le 100 ]; then 
    echo "...." 
elif [ "$num" -eq 7 ] 
    echo "...." 
else 
    echo "You didn't pick a number between 1 and 100!" 
fi 
0

Это работает Тхо ...

if [ "$num" = "7" ]; then 
    echo -e "\n\n\033[33m YOU GUESSED MY FAVORITE NUMBER!\n\n" 
else 
    echo "That's not my number. HINT: Red XIII" 
    while [ "$num" != "7" ]; do 
    echo -e -n "\n\033[32m Pick again > " 
    read num 
     if [ "$num" = "7" ]; then 
     echo -e "\n\n\033[33m YOU GUESSED MY FAVORITE NUMBER!\n\n" 
     fi 
    done 
fi 

Не совсем то, что я шел.

0
#!/bin/bash 
# 
# guess_my_number.bash - my favorite number 

echo "Can you guess my favorite number???" 

echo -e -n "\n\n\033[32m Pick a number between 0 and 100 > " 
read num 
case $num in 

[0-6])    echo "You're close...but too low" ;; 
[8-9])   echo "You're close...but too high" ;; 
1[0-4])    echo "You're close...but too high" ;; 
[1-9][0-9])   echo "You're nowhere near my favorite number...sorry, try again" ;; 
    7)     echo "YOU GUESSED MY FAVORITE NUMBER!" ;; 
    *)     echo "You didn't pick a number between 1 and 100!" ;; 

esac 
+0

@ user7526725 убедитесь, что в коде вы должны иметь в диапазоне только комбинацию одной цифры. Надеюсь, это тебе помогло. – Anup

+0

@ user7526725 вы можете использовать "или" operator "|" иметь две строки [8-9]) echo «Вы близки ... но слишком высоко» ;; 1 [0-4]) echo «Вы близки ... но слишком высоко» ;; новый формат: [8-9] | 1 [0-4]) echo «Вы близки ... но слишком высоко» ;; – Anup

+0

Я вижу. Я думал, что это могло быть связано с переходом 0-9. Thanx. – user7526725

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

  • Нет связанных вопросов^_^