if, elif, başka Bash ile ilgili sorunları bildirir


359

Aşağıdaki ile sorunu ne işe görünmektedir olamaz ifaçıklamaya sorudur elifve then. printfHâlâ geliştirilme aşamasında olduğunu unutmayın, henüz ifadede henüz test edemedim, bu yüzden büyük olasılıkla yanlıştır.

Aldığım hata:

./timezone_string.sh: line 14: syntax error near unexpected token `then'
./timezone_string.sh: line 14: `then'

Ve ifade böyle.

if [ "$seconds" -eq 0 ];then
   $timezone_string="Z"
elif[ "$seconds" -gt 0 ]
then
   $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
else
   echo "Unknown parameter"
fi

7
Biz Acaba neden ihtiyaçthen içinde deyimi ifve elifancak içinde elseve aynı zamanda genel olarak.

@ w17t, çünkü koşulu sekanstan ayırmamız gerekiyor.
Sasha

3
@codeforester Bir 500K görünümleri sorusunu sadece 5K
olana

Bazı kod otomatik biçimlendirme araçlarını kullanmak, köşeli parantezlerin çevresine otomatik olarak boşluk ekleyerek / kaldırarak size yardımcı olabilir. Düzenleyiciniz için eklentiler arayabilirsiniz.
Nj Subedi

Yanıtlar:


453

elifVe arasında eksik bir boşluk var [:

elif[ "$seconds" -gt 0 ]

olmalı

elif [ "$seconds" -gt 0 ]

Gördüğüm gibi, bu soru çok fazla görüş alıyor, takip edilecek sözdiziminin olduğunu belirtmek önemlidir:

if [ conditions ]
# ^ ^          ^

yani parantezlerin etrafında boşluklar olması gerekir . Aksi takdirde çalışmaz. Bunun nedeni [kendisi olduğunu bir komut.

Eğer böyle bir şey göremiyoruz nedeni elif[: command not found(veya benzeri) gördükten sonra olmasıdır ifve thenkabuk ya arıyor elif, elseya da fi. Ancak başka bir tane bulur then(yanlış biçimlendirildikten sonra elif[). Yalnızca ifadeyi ayrıştırdıktan sonra yürütülür (ve bunun gibi bir hata mesajı verilir elif[: command not found).


33
Köşeli parantezlerin boşluklara ihtiyaç duymasının nedeni, gerçek programlar için kısayol olmalarıdır (en azından ilk parantez, ikincisi anladığım kadarıyla sadece sözdizimsel şekerdir). Bunu anlamak için, sol köşeli parantezin gerçek kılavuzuna bakın:$ man [
Michael Johansen

3
Bu yazının yazım hatası olarak kapatılması gerekmiyor mu?
18:58, zx8754

3
@ zx8754 olabilirdi, ama bu hatayı düzeltmek için kanonik bir yol haline gelmedi, bu oldukça yararlı görünüyor (360K görüntüleme ve sayma).
fedorqui 'SO 16.08.2018'

3
Bazı meslektaşlarım "alan" veya "kodlama stili" kavramını anlamıyorlar, bu yüzden bu bir yazım hatası olmayabilir.
juzzlin

3
[test komutu için bir tür takma addır. Bu yüzden boş karakter gereklidir. if test "$seconds" -eq 0; then ... fieşittir if [ "$seconds" -eq 0 ];then ... fi ]. @LeiYang man testaradığınız şey
Melicerte

304

Komut dosyanızla ilgili bazı sözdizimi sorunlarınız var. İşte sabit bir sürüm:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

76
İşin garibi, bu stackexchange üzerinde kolayca bulduğum tek tam ve basit bash "if-then-else" yapısı oldu ... teşekkürler.
Wildcard

1
girinti isteğe bağlıdır. tercüman olabilir (ve olmalıdır) #!/bin/sh.

3
Chinggis6 Toplam saçma @, tercüman olabilir olmak #!/bin/shama zorunda değildir.
Camusensei

4
@Camusensei o kadar toplam saçmalık değil shyüksek uyumluluk için yerine kullanılabilir (hepsi değil * Nix dağıtımlar vardır bash varsayılan kabuk olarak (bazı ksh veya kül var ama bunların çoğu standart bağlıdır do shişleve). Üstelik eğer bash spesifik veya betikte gelişmiş özellikler kullanılmıyorsa betiği tek başına işleyebileceğinden yorumlayıcı olarak (sh için bir neden daha kullanılmalıdır) kullanılmalıdır.

6
@ Chinggis6 Yanımda doğru, kötü kelime seçimi.
Camusensei

25

[bir komuttur (veya bazı kabuklarda yerleşiktir). Bir önceki ifadeden boşlukla ayrılmalıdır:

elif [

3
Bash'taki bir yerleşik tarafından yerini aldı, ancak mesajınız hala doğru. type -a [görmek için kullanın .
Camusensei

Aynı zamanda her zaman bana garip gelen bir ikili.
mr.zog

4

Ben bash klima temelleri bir göz olması tavsiye ederim.

"[" Sembolü bir komuttur ve öncesinde boşluk olması gerekir. Eğer elifinizden sonra boşluk bırakmazsanız, sistem elif'i [ şu anda kesinlikle istediğiniz bir şey olmayan belirli bir komut olarak değerlendirir.

Kullanımı:

elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]

Kısacası, kod segmentinizi şu şekilde düzenleyin:

elif [ "$seconds" -gt 0 ]

Hiçbir derleme hatası ile iyi olurdu. Son kod segmentiniz şöyle görünmelidir:

#!/bin/sh    
if [ "$seconds" -eq 0 ];then
       $timezone_string="Z"
    elif [ "$seconds" -gt 0 ]
    then
       $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
    else
       echo "Unknown parameter"
    fi

2

Programınız arasında kalan elifve [kalan boşluklar doğrudur. bir kontrol etmeniz gerekir. İşte sabit program:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

else bash ifadesi ile ilgili faydalı link

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.