2014-07-16 15 views
31

Qui il mio problema è trovare la differenza nell'uso dell'unica parentesi [] e delle parentesi quadre [[]] nell'istruzione if.Errore script shell: valore troppo elevato per la base (il token di errore è "08")

#!/bin/bash 
vara=08; 
varb=10; 

## single bracket in if statment is working. 
if [ $vara -lt $varb ]; then 
echo "yes"; 
else 
echo "no"; 
fi 


## double brackets in if statment is not working; throwing an error like below. 
## [[: 08: value too great for base (error token is "08") 
if [[ $vara -lt $varb ]]; then 
echo "yes"; 
else 
echo "no"; 
fi 

risposta

59

La shell tenta di interpretare 08 come un numero ottale, poiché inizia con uno zero. Tuttavia, solo le cifre 0-7 sono consentite in ottale, in quanto decimale 8 è ottale 010. Quindi 08 non è un numero valido, e questo è il motivo dell'errore.

Le parentesi singole sono un tipo di "modalità di compatibilità" con sh e sh non conosce i numeri ottali.

Quindi, se si utilizza singole parentesi quadre, "010" sarà interpretato come 10, mentre con doppie parentesi quadre, "010" verrà interpretato come 8.

Se si utilizza singole parentesi quadre, "08 "sarà interpretato come 8, mentre con doppie parentesi quadre, non è un numero valido e porta a un errore.

È possibile evitare l'errore utilizzando la soluzione descritta qui: https://stackoverflow.com/a/12821845/1419315

if [[ ${vara#0} -lt ${varb#0} ]] 

o

if [[ $((10#$vara)) -lt $((10#$varb)) ]] 
+0

grazie mille per la tua risposta immediata @JohnB, in realtà abbiamo ottenuto questo lavoro in shell bash con staffa singola. non funziona con doppie parentesi [[. C'è qualche idea sul comportamento delle parentesi singole e doppie nella shell mentre si usa 08 e 09 in if statement – Thaangaraj

+1

Il problema è lo 0 iniziale, che farà in modo che la shell interpreti la stringa come ottale. Prova questa http://stackoverflow.com/a/12821845/1419315 soluzione: 'if [[$ {vara # 0} -lt $ {varb # 0}]]' – JohnB

+2

Puoi specificare esplicitamente la base numerica con _n # _ , quindi '10 # 08' sarà riconosciuto. – rojomoke

Problemi correlati