Jika, Elif, pernyataan masalah lain di Bash

358

Saya sepertinya tidak bisa menyelesaikan masalah apa dengan ifpernyataan berikut sehubungan dengan elifdan then. Ingatlah bahwa printfini masih dalam pengembangan. Saya belum bisa mengujinya dalam pernyataan itu, jadi kemungkinan besar salah.

Kesalahan yang saya dapatkan adalah:

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

Dan pernyataannya seperti itu.

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
StuStirling
sumber
7
Saya bertanya-tanya mengapa kita perlu yang thenpernyataan dalam ifdan eliftetapi tidak dalam else, dan juga pada umumnya.
@ w17t, karena kita perlu memisahkan kondisi dari urutan.
Sasha
3
@ kodeforester Saya tidak melihat banyak logika untuk menandai pertanyaan tampilan 500 ribu sebagai duplikat ke pertanyaan yang hanya memiliki 5
ribu
Menggunakan beberapa alat pemformatan otomatis kode mungkin membantu Anda dengan secara otomatis menambah / menghapus spasi di sekitar tanda kurung. Anda dapat mencari plugin untuk editor Anda.
Nj Subedi

Jawaban:

453

Ada ruang yang hilang antara elifdan [:

elif[ "$seconds" -gt 0 ]

seharusnya

elif [ "$seconds" -gt 0 ]

Ketika saya melihat pertanyaan ini mendapatkan banyak pandangan, penting untuk menunjukkan bahwa sintaks yang harus diikuti adalah:

if [ conditions ]
# ^ ^          ^

artinya dibutuhkan ruang di sekitar tanda kurung . Kalau tidak, itu tidak akan berhasil. Ini karena [itu sendiri adalah perintah.

Alasan mengapa Anda tidak melihat sesuatu seperti elif[: command not found(atau serupa) adalah bahwa setelah melihat ifdan then, shell mencari baik elif, elseatau fi. Namun ia menemukan yang lain then(setelah diformat salah elif[). Hanya setelah mem-parsing pernyataan itu akan dieksekusi (dan pesan kesalahan seperti elif[: command not foundakan menjadi output).

fedorqui 'SO berhenti merugikan'
sumber
33
Alasan kurung memerlukan spasi adalah karena mereka hanya jalan pintas untuk program aktual (setidaknya braket pertama, yang kedua hanya gula sintaksis seperti yang saya mengerti). Untuk membuatnya masuk akal, lihat halaman manual sebenarnya untuk braket kiri:$ man [
Michael Johansen
3
Apakah posting ini tidak seharusnya ditutup sebagai kesalahan ketik?
zx8754
3
@ zx8754 bisa saja, tetapi bukan itu menjadi cara kanonik untuk memperbaiki kesalahan ini, yang terlihat sangat berguna (360K dilihat dan dihitung).
fedorqui 'SO berhenti merugikan'
3
Beberapa rekan saya tidak mengerti konsep "ruang" atau "gaya pengkodean" jadi ini mungkin bukan kesalahan ketik.
juzzlin
3
[adalah semacam alias untuk perintah tes. Inilah sebabnya mengapa karakter kosong diperlukan. if test "$seconds" -eq 0; then ... fisetara dengan if [ "$seconds" -eq 0 ];then ... fi ]. @LeiYang man testadalah apa yang sebenarnya Anda cari
Melicerte
303

Anda memiliki beberapa masalah sintaksis dengan skrip Anda. Ini adalah versi tetap:

#!/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
anubhava
sumber
76
Anehnya, ini adalah satu-satunya konstruksi "jika-lalu-lain" yang lengkap dan sederhana yang bash saya temukan dengan mudah di stackexchange ... terima kasih.
Wildcard
1
lekukan adalah opsional. penerjemah dapat (dan seharusnya) menjadi #!/bin/sh.
3
@ Chinggis6 Jumlah omong kosong, penafsir bisa menjadi #!/bin/shtetapi tidak harus.
Camusensei
4
@Camusensei ini bukan omong kosong total karena shdapat digunakan sebagai gantinya untuk kompatibilitas yang lebih tinggi (tidak semua * nix distro memiliki bash sebagai shell default (beberapa memiliki ksh atau abu tetapi kebanyakan dari mereka memang bergantung pada standar shfungsi). Apalagi jika spesifik bash atau fitur lanjutan tidak digunakan dalam skrip maka 'sh' harus digunakan sebagai penerjemah (satu alasan lagi untuk itu) karena dapat menangani skrip dengan sendirinya.
6
@ Chinggis6 Benar, pilihan kata yang salah ada di pihak saya.
Camusensei
25

[adalah perintah (atau builtin di beberapa shell). Itu harus dipisahkan oleh spasi putih dari pernyataan sebelumnya:

elif [
choroba
sumber
3
Itu diunggulkan oleh builtin di bash, tetapi pesan Anda masih benar. gunakan type -a [untuk melihat itu.
Camusensei
Ini juga biner yang selalu terasa aneh bagi saya.
mr.zog
4

Saya akan merekomendasikan Anda melihat dasar-dasar pengkondisian di bash.

Simbol "[" adalah perintah dan harus memiliki spasi putih sebelum itu. Jika Anda tidak memberikan spasi setelah elif Anda, sistem mengartikan elif [ sebagai perintah khusus yang jelas bukan yang Anda inginkan saat ini.

Pemakaian:

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

Singkatnya, edit segmen kode Anda ke:

elif [ "$seconds" -gt 0 ]

Anda akan baik-baik saja tanpa kesalahan kompilasi. Segmen kode akhir Anda akan terlihat seperti ini:

#!/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
Tuan Weirdo
sumber
2

Ruang kosong di antara elifdan [istirahat program Anda sudah benar. Anda harus memperbaikinya dan memeriksanya. di sini adalah program tetap:

#!/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

tautan bermanfaat yang terkait dengan pernyataan bash if else

John Walsh
sumber