Isso sempre será verdadeiro para números, já que a condição é ou :
if [ $number -gt 9 -o $number -lt 100 ]
Esse primeiro scriptlet reconhece Ten e Eleven e imprime Thirteen para todos os outros valores.
Isso sempre será falso, pois a condição é e :
if [ $number -lt 0 -a $number -gt 999 ]
Não sei por que você está criando o restante com case e if s. Se você quiser apenas mapear os números para palavras, um de cada vez, um único caso seria:
case "$number" in
0) echo Zero ;;
1) echo One ;;
# ...
9) echo Nine ;;
10) echo Ten ;;
11) echo Eleven ;;
esac
Isso não reconhecerá números com zeros iniciais (mas todas as operações aritméticas os tomarão como números de base-8, a menos que você tenha o cuidado de forçar a base manualmente a cada vez).
Se você quiser ir além de vinte, a correspondência de uma vez não será muito boa e não poderá corresponder a intervalos de números arbitrários com case . Em case , 10|99 corresponderá exatamente a essas duas cadeias (não 12 ou 123 ) e [0-9] corresponderá a dígitos únicos, por exemplo, [0-100] é o mesmo que [01] . Então, um if pode ser melhor:
if [[ $number -ge 20 -a $number -lt 30 ]]; then
echo Twenty-something
elif [[ $number -ge 20 -a $number -lt 30 ]]; then
echo Thirty-something
fi
Você deve usar [[ .. -a .. ]] ou [ .. ] && [ .. ] aqui, como [ .. -a .. ] como problemas com alguns valores (como "!" ). Se você fizer usar [ .. ] , cite as variáveis, ou seja, [ "$number" -lt 123 ] em vez de [ $number -lt 123 ] .
Isso deve funcionar, mas apenas porque você pode corresponder a uma posição específica de um dígito:
case $number in
2?) echo Twenty-something ;;
3?) echo Thirty-something ;;
esac
Se você realmente quiser dar nomes a todos os números de zero a mil, você precisará dividir o problema em partes (uns, dezenas, como combiná-los) e, de preferência, usar funções para isso.