2016-04-12 34 views
0

sözdizimi hatası Açıklayamıyorum:Ben bu kontrol ifadesini yazdı senaryom ise bash komut

if ! [[ $start -gt $(cut -f3 rooms.txt) -a $end -gt $(cut -f4 rooms.txt) ]]; then 
    echo "Invalid prenotation"; 
    ./prenote.sh; 
fi 

start ve end basit sayılardır. dosyasında rooms.txt her kayıt bu şekilde oluşturulmuştur: kayıtlarında olmayan boşluk vardır

room;date;start;end;username 

. Komut dosyasını çalıştırdığımda if ifadesinin yakınında bir sözdizimi hatası alıyorum.

Birisi bana hatanın nerede olduğunu söyleyebilir mi?

+2

http://www.shellcheck.net/ sizin için bu hatayı yakaladı olurdu. –

+0

Şaşırtıcı bir şekilde, dosya içinde [['' -a dosyaadı 'öğesi doğruysa. Yani '' a' içinde farklı bir anlamı vardır '' (test) ve '[['. Bu arada, her satırın sonunda bir yarı kolonya ihtiyacınız yok. – cdarke

cevap

4

"ve" için -a numaralı işleç, [[ ... ]] koşullu koşullarında geçerli değildir. Bunun yerine && kullanın.

Ama bash sayısal karşılaştırmalar yapıyoruz, eğer daha mantıklı (( ... )) yerine [[ ... ]] kullanmak neden olabilir. Sonra, normal ilişkisel operatörler yerine dize tabanlı sayısal, bu yüzden -gt yerine > kullanabilirsiniz:

if ! ((start > $(cut -f3 rooms.txt) && end > $(cut -f4 rooms.txt))); then 
... 
fi 

Ancak, bu yaklaşım sadece rooms.txt tek çizgi varsa çalışır; aksi halde, $(cut...) komutları birden fazla sayı üretdiğinde sözdizimi hataları alırsınız. Ne çözme tam olarak ne sorun olduğundan emin değilim, ama böyle bir yaklaşım şey verimli olabilir:

while read _ _ low high _; do 
    if ! ((start > low && end > high)); then 
    ... 
    fi 
done <rooms.txt 
+0

Güzel cevap teşekkürler! – keras