Come posso impedire a Bash di interpretare il codice ottale anziché il numero intero?


13

Sto scrivendo uno script RSS di Horoscope come introduzione al progetto Unix / Linux e ho riscontrato un problema che il mio professore non è riuscito a risolvere nel tempo in cui sono stato in grado di rimanere dopo le lezioni. Dal momento che non riuscivo a capire come usare le date effettive come cosa controllare, ho pensato di provare l'aritmetica di base facendo in modo che l'input dell'utente fosse un numero standard in formato MMDD. Secondo lui, lo script sembra leggere l'input come codice ottale anziché intero. Ecco un esempio dello 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

Queste sono le ossa nude, ho tolto la parte RSS. "olddate" è l'input previsto dal mio prompt di lettura. Mentre da 1121 a 1131, da 1200 a 1222 e da 0100 a 0120 funzionano, non funziona nulla tra 1221 e 1232. Ha pensato che fosse il problema da quando ha messo 113 senza uno 0 iniziale ha funzionato per il Capricorno. Ho anche incontrato un problema in cui 0323 che avrebbe dovuto darmi Ariete (-gt 0320 && -lt 0332) mi ha dato Aquarius (le cui date sono -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) come così come 0417 non funziona (che è l'altro intervallo di date per Ariete, -gt 0400 && -lt 0420).

Cosa devo fare affinché BASH interpreti l'input come i numeri effettivi? Ha provato a cambiare il prompt di lettura aspettandosi "userdate" come input e quindi aggiungendo

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

ma non ha funzionato. Grazie in anticipo a chiunque mi possa aiutare in questo!


Impossibile duplicare su bash 4.4.12.
Ignacio Vazquez-Abrams,

1
$ olddate è una stringa, non un numero, quindi usa i confronti di stringhe ed evita l'intero casino.
Stephen Harris,

2
@StephenHarris: lo sono anche i valori a destra degli operatori. Ecco perché testha operatori numerici espliciti.
Ignacio Vazquez-Abrams,

Una cosa da notare, ma non correlata alla domanda principale, è che il tuo segno zodiacale dipende anche parzialmente dall'anno in cui sei nato, se il tuo giorno e il tuo mese di nascita erano vicini alla transizione tra 2 segni zodiacali. Il tuo segno zodiacale si basa sulla parte 1/12 del cielo in cui era il sole al momento della tua nascita, ma poiché il numero di giorni in un anno non è un numero intero né divisibile per 12, c'è qualche variazione da di anno in anno. Questa variazione è troppo complessa per essere catturata realmente negli alberi if-else, ma è solo qualcosa che potrebbe essere utile sapere.
Nzall,

Risposte:


28

Puoi forzare la conversione di un numero in una base specifica in bash in questo modo:

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

In generale il formato è $((base#value)).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.