2017-02-07 19 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]我运行脚本,但是从9-100任何其他数给我的通配符回声响应时,你得到的回声响应,如果我在8型。如果它是[8-14],它也会给我通配符响应。就像我说的[0-6]模式给出了它的回声陈述,那么也是7.

这里我的问题是什么?

+2

[使用案例Numbe的一系列可能的重复在Bash中的正则表达式](http://stackoverflow.com/questions/12614011/using-case-for-range-of-numbers-in-bash) –

+0

[Bash case语句中的正则表达式]的可能重复(http:/ /stackoverflow.com/questions/9631335/regular-expressions-in-a-bash-case-statement) – codeforester

+0

嗯... thanx,但我不知道我是否理解其他问题。 – user7526725

回答

0

正如其他链接所建议的,case只能执行模式匹配而不能执行arithmetice扩展。 这意味着你可以在[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-THEN-ELSE最好的:

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你可以使用“或”运算符“|”有两条线[8-9])回声“你接近......但太高”;; 1 [0-4])回声“你很近......但太高了”;;新格式:[8-9] | 1 [0-4])回声“你接近......但太高”;; – Anup

+0

我明白了。我认为这可能与0-9的差距有关。感谢名单。 – user7526725