Оператор case bourne / bash соответствует всей строке, тогда как egrep (в вашем примере) соответствует только начальным символам.
В вашем примере вы бы изменили свое заявление с делом на:
case "$x" in
[0-9][0-9]*)
statements;;
[0-9]*)
statemtns;;
*)
statements for unmatched....
esac
Обратите внимание, что я изменил порядок, потому что первое совпадение вступит в силу. Кроме того, я цитировал $ x, потому что я параноик;) Вы можете опустить кавычки на $ x, если у него могут быть начальные пробелы, которые вы хотите игнорировать.