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.