2014-07-16 11 views
31

Tutaj mój problem polega na znalezieniu różnicy za pomocą pojedynczego nawiasu [] i podwójnych nawiasów [[]] w instrukcji if.Błąd skryptu powłoki: wartość zbyt duża dla bazy (błąd token "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 

Odpowiedz

59

Powłoka próbuje interpretować 08 jako liczbę ósemkową, ponieważ zaczyna się od zera. Dozwolone są jednak tylko cyfry 0-7 ósemkowe, ponieważ dziesiętnie 8 to ósemkowe 010. Stąd 08 nie jest prawidłową liczbą i to jest przyczyną błędu.

Pojedyncze nawiasy są rodzajem "trybu zgodności" z sh, a sh nie zna cyfr ósemkowych.

Tak więc, jeśli używać pojedynczych nawiasów kwadratowych, „010” będzie interpretowany jako 10, natomiast z podwójnych nawiasach kwadratowych, „010” będzie interpretowane jako 8.

przypadku użycia pojedynczych nawiasów kwadratowych „08 "będzie interpretowane jako 8, a podwójne nawiasy kwadratowe nie będą poprawną liczbą i prowadzą do błędu.

Można uniknąć błędu przy użyciu rozwiązanie opisane tutaj: https://stackoverflow.com/a/12821845/1419315

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

lub

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

bardzo dziękuję za natychmiastową reakcję @JohnB, właściwie mamy to działa w powłoki bash z pojedynczym wspornikiem. nie działa z podwójnymi nawiasami [[. Czy jest jakiś pomysł na zachowanie pojedynczych i podwójnych nawiasów w powłoce podczas używania 08 i 09 w instrukcji if – Thaangaraj

+1

Problem jest wiodącym 0, co spowoduje, że powłoka interpretuje ciąg jako ósemkowy. Wypróbuj to rozwiązanie http://stackoverflow.com/a/12821845/1419315: 'if [[$ {vara # 0} -lt $ {varb # 0}]]' – JohnB

+2

Możesz jawnie określić bazę liczbową za pomocą _n # _ , więc "10 # 08" zostanie rozpoznane. – rojomoke

Powiązane problemy