Como faço para impedir que o Bash interprete o código octal em vez do número inteiro?

Como faço para impedir que o Bash interprete o código octal em vez do número inteiro?

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)).

informação relacionada