Dalam jawaban untuk pertanyaan ini tentang komentar dalam skrip shell , diindikasikan bahwa :
ini adalah perintah nol yang secara eksplisit tidak melakukan apa-apa (tetapi tidak digunakan untuk komentar).
Apa manfaat dari perintah yang sama sekali tidak melakukan apa pun?
shell
shell-script
DQdlM
sumber
sumber
:
diperlukan untuk menjadi built-in, sementaratrue
tidak, yang mempengaruhi ruang lingkup variabelJawaban:
Saya biasanya menggunakan
true
loop; Saya pikir itu lebih jelas:Satu tempat yang saya temukan
:
sangat berguna adalah pernyataan kasus, jika Anda perlu mencocokkan sesuatu tetapi tidak ingin melakukan apa pun. Sebagai contoh:sumber
true
untuk suatu kondisi,:
untuk NOP.case a in a ) ;; esac
. Apakah ada beberapa kerang yang tidak menerima ini?case ${var} in value);; *) do_something;; esac
dapat diterima. The:
perintah tidak diperlukan untuk kasus-kasus yang kosong.Awalnya, ini digunakan untuk menentukan bahwa itu adalah program shell Bourne, yang bertentangan dengan program yang dikompilasi C. Ini sebelum shebang dan beberapa bahasa scripting (csh, perl). Anda masih dapat menjalankan skrip dimulai dengan hanya
:
:Ini umumnya akan menjalankan skrip terhadap
$SHELL
(atau/bin/sh
).Sejak itu, penggunaan utama adalah untuk mengevaluasi argumen. Saya masih menggunakan:
untuk menetapkan nilai default dalam skrip.
sumber
:
berguna untuk menulis loop yang harus diakhiri dari dalam.Ini akan berjalan selamanya kecuali
break
atauexit
dipanggil, atau shell menerima sinyal terminating.sumber
while true; do ...; done
mengomunikasikan niat untuk pembaca lebih baik daripadawhile :; do ...; done
Ketika Anda menginginkan pernyataan "kecuali" dalam skrip shell, Anda bisa menggunakan kondisi "tidak", yang dapat terlihat konyol untuk beberapa tes, atau Anda menggunakan ':' dalam klausa yang benar, dengan kode nyata di false- ayat.
"Kondisi eksotis" bisa menjadi sesuatu yang tidak ingin Anda abaikan, atau itu hanya jauh lebih jelas jika Anda tidak menggunakan "logika negatif".
sumber
autoconf
karena lebih mudah untuk menambahkan default:
untuk cabang kosong daripada mencari cara untuk membalikkan kondisi.!
depan[ some-exotic-condition ]
konyol, tapi berlebihan: else
setelah itu tidak konyol.!
Token meniadakan seluruh elemen pipa perintah.while ! grep ... ; do ... done
atauif ! [ ... ] ; then ... fi
. Ini pada dasarnya eksternal untuktest/[]
sintaks. Lihat: pubs.opengroup.org/onlinepubs/9699919799/utilities/…Saya hanya pernah menggunakan ini di samping karakter # untuk sementara mengomentari sebuah baris, dalam situasi di mana mengomentari baris menghasilkan kesalahan sintaksis, karena cacat dalam tata bahasa shell tidak memungkinkan urutan perintah kosong :
Tanpa: kami memiliki urutan perintah yang hilang, yang merupakan kesalahan sintaksis.
sumber
Ada dua kasus yang menurut saya
:
berguna:Tugas variabel default
Ini adalah cara yang mudah untuk memungkinkan pengguna skrip shell Anda menimpa pengaturan tanpa mengedit skrip. (Namun, argumen baris perintah lebih baik karena Anda tidak menjalankan risiko perilaku tak terduga jika pengguna secara kebetulan memiliki variabel yang Anda gunakan di lingkungan yang diekspor.) Berikut ini cara pengguna akan menimpa pengaturan:
The
${VAR=value}
sintaks mengatakan untuk setVAR
kevalue
jikaVAR
belum diatur, kemudian memperluas dengan nilai variabel. Karena kita belum peduli tentang nilai variabel, itu dilewatkan sebagai argumen pada perintah no-op:
untuk membuangnya.Meskipun
:
perintah no-op, ekspansi dilakukan oleh shell (bukan:
perintah!) Sebelum menjalankan:
perintah sehingga penugasan variabel tetap terjadi (jika berlaku).Ini juga dapat diterima untuk menggunakan
true
atau perintah lain sebagai gantinya:
, tetapi kode menjadi lebih sulit dibaca karena maksudnya kurang jelas.Skrip berikut juga berfungsi:
Tetapi hal di atas jauh lebih sulit untuk dipertahankan. Jika baris menggunakan
${VAR}
ditambahkan di atasprintf
garis itu, perluasan tugas default harus dipindahkan. Jika pengembang lupa untuk memindahkan tugas itu, bug diperkenalkan.Sesuatu untuk dimasukkan ke dalam blok bersyarat kosong
Blok bersyarat kosong umumnya harus dihindari, tetapi kadang-kadang berguna:
Beberapa orang berpendapat bahwa memiliki
if
blok benar kosong dapat membuat kode lebih mudah dibaca daripada meniadakan tes. Sebagai contoh:bisa dibilang lebih mudah dibaca daripada:
Namun saya percaya ada beberapa pendekatan alternatif yang lebih baik daripada blok kosong yang benar:
Masukkan kondisi dalam suatu fungsi:
Masukkan kondisi di dalam kurung kurawal (atau tanda kurung, tetapi kurung menelurkan proses subkulit dan perubahan apa pun yang dilakukan terhadap lingkungan di dalam subkulit tidak akan terlihat di luar subkulit) sebelum meniadakan:
Gunakan
||
alih-alihif
:Saya lebih suka pendekatan ini ketika reaksinya sederhana, seperti menyatakan kondisi:
sumber
Dalam shell pre-bourne lama di UNIX versi kuno,
:
perintah ini awalnya dimaksudkan untuk menentukan label untukgoto
(itu adalah perintah terpisah yang memutar input ke tempat label ditemukan, sehingga label tidak dapat menjadi sintaksis terpisah yang shell tahu tentang.if
juga merupakan perintah terpisah.) Segera menjadi digunakan untuk komentar, sebelum ada sintaks komentar (#
digunakan untuk backspace) dan hari ini ada sekitar untuk kompatibilitas sebanyak apa pun.sumber
Selain menggunakannya sebagai pernyataan yang tidak melakukan apa-apa, Anda dapat menggunakannya untuk mengomentari pernyataan tunggal dengan mengubahnya menjadi argumen untuk:.
sumber
: echo write this line > myfile
masih akan membuat file kosong.:
adalah TIDAK mekanisme berkomentar yang memadai.