Como faço para parar o Bash de interpretar código octal em vez de inteiro?

13

Estou escrevendo um script RSS do Horóscopo como uma introdução ao projeto Unix / Linux e deparei-me com um problema que meu professor não conseguiu resolver no período em que pude ficar depois da aula. Como não conseguia descobrir como usar datas reais como o que 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 inteiro. Aqui está uma amostra 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. Enquanto 1121 a 1131, 1200 a 1222 e 0100 a 0120 funcionam, nada entre 1221 a 1232 funciona. Ele imaginou que esse era o problema, já que colocar 113 sem um 0 à frente funcionava para Capricórnio. Eu também acabei de encontrar 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 0417 não está funcionando (que é o outro período de Áries, -gt 0400 e& -lt 0420).

O que faço para que o BASH interprete a entrada como os números reais? Ele tentou alterar o prompt de leitura para esperar "data do usuário" como entrada e, em seguida, adicionar

olddate=`printf '%d\n' "$userdate"`

mas isso não funcionou. Agradecemos antecipadamente a quem puder me ajudar nisso!

Irre Levant
fonte
Não é possível duplicar no bash 4.4.12.
Ignacio Vazquez-Abrams
1
$ olddate é uma string, não um número, então use comparações de strings e evite toda a bagunça.
Stephen Harris
2
@StephenHarris: Assim são os valores à direita dos operadores. É por isso que testpossui operadores numéricos explícitos.
Ignacio Vazquez-Abrams
Uma coisa a observar, mas não relacionada à questão central, é que o seu signo do zodíaco também depende parcialmente do ano em que nasceu, se o seu dia e mês de nascimento estiver próximo da transição entre dois signos do zodíaco. Seu signo do zodíaco é baseado na parte 1/12 do céu em que o sol estava no momento em que você nasceu, mas como o número de dias em um ano não é um número inteiro nem divisível por 12, há algumas variações entre ano a ano. Essa variação é complexa demais para ser realmente capturada em árvores if-else, mas é apenas algo que pode ser bom saber.
Nzall 23/11

Respostas:

28

Você pode forçar a conversão de um número para uma base específica no bash, da seguinte maneira:

$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100

Em geral, o formato é $((base#value)).

Ignacio Vazquez-Abrams
fonte