Estou escrevendo um script RSS do Horóscopo como uma introdução ao projeto Unix/Linux e me deparei com um problema que meu professor não conseguiu resolver no tempo que pude ficar depois da aula. Como não consegui descobrir como usar datas reais para verificar, pensei em tentar a aritmética básica fazendo com que a entrada do usuário fosse números padrão no formato MMDD. Segundo ele, o script parece estar lendo a entrada como código octal em vez de número inteiro. Aqui está um exemplo do script:
elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ]
then
echo "You are Sagittarius"
exit
elif [ "$olddate" -gt 1221 ] && [ "$olddate" -lt 1232 ] || [ "$olddate" -gt 0100 ] && [ "$olddate" -lt 0120 ]
then
echo "You are Capricorn"
exit
Este é o esqueleto, tirei a parte do RSS. "olddate" é a entrada esperada do meu prompt de leitura. Embora 1121 a 1131, 1200 a 1222 e 0100 a 0120 funcionem, nada entre 1221 a 1232 funciona. Ele percebeu que esse era o problema, já que colocar 113 sem o 0 inicial funcionava para Capricórnio. Eu também tive um problema em que 0323, que deveria me dar Áries (-gt 0320 && -lt 0332), me deu Aquário (cujas datas são -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) como bem como 0417 não funciona (que é o outro intervalo de datas para Áries, -gt 0400 && -lt 0420).
O que devo fazer para que o BASH interprete a entrada como números reais? Ele tentou alterar o prompt de leitura para esperar "userdate" como entrada e depois adicionar
olddate=`printf '%d\n' "$userdate"`
mas isso não funcionou. Desde já agradeço a quem puder me ajudar nisso!
Responder1
Você pode forçar a conversão de um número para uma base específica no bash assim:
$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100
Em geral o formato é $((base#value))
.