Saya tidak selalu menginginkan jawaban tetapi jika seseorang dapat mengarahkan saya ke beberapa literatur atau contoh. Saya ingin mencari tahu.
Ketika saya menjalankan skrip saya menerima kesalahan:
Kesalahan sintaksis dekat token yang tidak terduga
fi
Saya telah menyimpulkan bahwa masalah saya ada dalam if
pernyataan saya dengan membuat if
komentar pernyataan saya dan menambahkan echo "$NAME"
yang menampilkan nama dalam/etc/
.
Ketika saya membuat perubahan, hapus #
dari if
dan fi
dan tambahkan #
ke wc -c "$NAME"
, saya menerima kesalahan sintaks yang saya sebutkan di atas. Saya telah menambahkan di ;
antara ]
itu. Saya juga pindah then
ke baris berikutnya tanpa resolusi.
#!/bin/bash
for NAME in /etc/*
do
if [ -r "$NAME" -af "$NAME" ] then
wc -c "$NAME"
fi
done
-af
seharusnya dilakukan?-a
itu berlebihan karena kondisinya sudah termasuk di dalamnya-f
. --- Bagaimanapun beberapa kondisi di dalam[ ]
(perintah ini juga tersedia sebagaitest
) harus digabungkan menggunakan operator logis seperti-a
(dan) atau-o
(atau) tetapi seperti yang disarankan dalam balasan di bawah ini, lebih baik menggunakan beberapa[ ]
(test
) perintah dan bergabung mereka menggunakan operator shell seperti&&
atau||
.Jawaban:
Kata kunci seperti
if
,then
,else
,fi
,for
,case
dan sebagainya perlu berada di tempat di mana shell mengharapkan nama perintah. Kalau tidak, mereka diperlakukan sebagai kata-kata biasa. Sebagai contoh,hanya mencetak
if
, itu tidak memulai instruksi bersyarat.Dengan demikian, sejalan
kata tersebut
then
adalah argumen dari perintah[
(yang akan dikeluhkan jika dijalankan). Shell terus mencarithen
, dan menemukanfi
posisi perintah. Karena adaif
yang masih mencarithen
, makafi
tidak terduga, ada kesalahan sintaksis.Anda harus meletakkan terminator perintah sebelum itu
then
sehingga dikenali sebagai kata kunci. Terminator perintah yang paling umum adalah jeda baris, tetapi sebelumnyathen
, sudah umum untuk menggunakan titik koma (yang memiliki arti yang sama persis dengan jeda baris).atau
Setelah Anda memperbaikinya Anda akan mendapatkan kesalahan lain dari perintah
[
karena tidak mengerti-af
. Anda mungkin dimaksudkanMeskipun perintah tes terlihat seperti opsi, Anda tidak dapat menggabungkannya seperti ini. Mereka adalah operator dari
[
perintah dan mereka perlu masing-masing menjadi kata yang terpisah (seperti yang dilakukan[
dan]
).Ngomong-ngomong, meski
[ -r "$NAME" -a -f "$NAME" ]
bekerja, saya sarankan menulis jugaatau
Yang terbaik adalah menjaga
[ … ]
kondisional tetap sederhana karena[
perintah tidak dapat membedakan operator dari operan dengan mudah. Jika$NAME
terlihat seperti operator dan muncul dalam posisi di mana operator itu valid, itu bisa diurai sebagai operator. Ini tidak akan terjadi dalam kasus-kasus sederhana yang terlihat dalam jawaban ini, tetapi kasus-kasus yang lebih kompleks dapat berisiko. Menulis ini dengan panggilan terpisah ke[
dan menggunakan operator logis shell menghindari masalah ini.Sintaks kedua menggunakan
[[ … ]]
konstruksi kondisional yang ada di bash (dan ksh dan zsh, tetapi tidak sh polos). Membangun ini sintaks khusus, sedangkan[
parsing seperti perintah lain, sehingga Anda dapat menggunakan hal-hal seperti&&
di dalam dan Anda tidak perlu variabel kutipan kecuali dalam argumen untuk beberapa operator tali (=
,==
,!=
,=~
) (lihat Kapan double-mengutip diperlukan ? untuk perincian).sumber
if [[ 1 ]] then [[ 2 ]] fi
bekerja di ksh, pdksh dan zsh.if(:)then(:)fi
bekerja di semua kerang.Lihat apa yang berubah sebagai berikut
Jika Anda ingin menghapus semua perintah di blok if, Anda setidaknya perlu menambahkan titik dua di dalamnya, seperti
atau versi satu baris
if [ -r "$NAME" -a -f "$NAME" ]; then :; fi
sumber
Orang lain sudah menunjukkan, tetapi jika Anda mencari referensi resmi maka RTM
Anda melewatkan
;
Dan sintaks untuk
list
dijelaskan dalamman test
sumber