Apa artinya "sementara:;"?

27

Saya tahu apa itu whileloop. Namun, saya hanya melihatnya bekerja dengan:

while [condition]
while ![condition]
while TRUE (infinite loop)

Dimana pernyataan sesudahnya whileharus berupa TRUEatau FALSE.

Ada perintah builtin shell bernama :. Ini digambarkan sebagai perintah dummy yang tidak melakukan apa-apa, tetapi saya tidak tahu apakah itu sama di sini, bahkan dapat TRUEatau tidak FALSE. Mungkin itu sesuatu yang berbeda, tetapi apa?

sharkant
sumber
4
Perintah :tidak melakukan apa pun kecuali selalu keluar dengan kode kembali 0. Jadi, itu sama saja while true(dengan asumsi sistem Anda memiliki trueexecutable).
John1024
@ John1024 Mengembalikan nol kecuali evaluasi argumennya menyebabkan kesalahan dengan, misalnya, menetapkan nilai ke variabel hanya baca.
Kusalananda
3
@ Kusalananda Ya, jika :perintah tidak pernah dieksekusi, itu tidak akan kembali 0. Tapi itu terlalu berlebihan menurut saya.
hvd

Jawaban:

50

Sintaksnya adalah:

while
  first list of commands
do
  second list of commands
done

yang menjalankan daftar perintah kedua dalam satu lingkaran selama daftar perintah pertama (jadi yang terakhir dijalankan dalam daftar itu) berhasil.

Dalam daftar perintah pertama , Anda dapat menggunakan [perintah untuk melakukan berbagai macam tes, atau Anda dapat menggunakan :perintah nol yang tidak melakukan apa pun dan mengembalikan kesuksesan, atau perintah lainnya.

while :; do cmd; done

Berulang cmd-ulang selamanya karena :selalu mengembalikan kesuksesan. Itu lingkaran selamanya . Anda bisa menggunakan trueperintah itu untuk membuatnya lebih terbaca:

while true; do cmd; done

Orang-orang dulu suka :seperti :yang selalu dibangun sementara true(tidak lama; sebagian besar shell telah truedibangun saat ini) ¹.

Varian lain yang mungkin Anda lihat:

while [ 1 ];  do cmd; done

Di atas, kami memanggil [perintah untuk menguji apakah string "1" tidak kosong (jadi selalu benar juga)

while ((1)); do cmd; done

Menggunakan ((...))sintaks Korn / bash / zsh untuk meniru while(1) { ...; }C.

Atau yang lebih berbelit-belit seperti until false; do cmd; done, until ! true...

Itu kadang-kadang disebut sebagai:

alias forever='while :; do'

Jadi Anda dapat melakukan sesuatu seperti:

forever cmd; done

Hanya sedikit orang yang menyadari bahwa kondisinya adalah daftar perintah. Misalnya, Anda melihat orang menulis:

while :; do
  cmd1
  cmd2 || break
  cmd3
done

Ketika mereka bisa menulis:

while
  cmd1
  cmd2
do
  cmd3
done

Masuk akal untuk menjadi daftar karena Anda sering ingin melakukan hal-hal seperti while cmd1 && cmd2; do...; doneyang merupakan daftar perintah juga.

Bagaimanapun, perhatikan bahwa itu [adalah perintah seperti yang lain (meskipun itu built-in di shell seperti Bourne modern), itu tidak harus digunakan hanya dalam daftar if/ while/ untilkondisi, dan daftar kondisi tersebut tidak memiliki untuk menggunakan perintah itu lebih dari perintah lainnya.


¹ :juga lebih pendek dan menerima argumen (yang diabaikannya). Sementara perilaku trueatau falsetidak ditentukan jika Anda memberikan argumen apa pun. Jadi seseorang dapat melakukan misalnya:

while : you wait; do
  something
done

Tapi, perilaku dari:

until false is true; do
  something
done

tidak ditentukan (meskipun akan bekerja di sebagian besar shell / falseimplementasi).

Stéphane Chazelas
sumber
12

while :adalah loop tak terbatas. :hanya tidak melakukan apa pun (berhasil).

Jadi jika Anda ingin shell Anda hang selamanya tanpa melakukan apa-apa, Anda dapat menuliskannya sebagai

while :
do
    :
done

Atau dalam satu baris dengan ;bukan baris baru:while :; do :; done

while :biasanya digunakan jika Anda ingin melakukan sesuatu berulang kali tanpa syarat khusus terlampir. Anda dapat menggunakan continue, breakpernyataan dalam loop untuk mengontrolnya atau untuk memindahkan kondisi ke akhir loop seperti sebuah do ... whilekonstruksi.

frostschutz
sumber
12

bagaimanapun, pernyataan setelahnya harus BENAR atau SALAH.

Tidak, perintah di bagian kondisi bisa berupa perintah apa saja (*) . Semua perintah shell memiliki beberapa nilai balik, dan whileloop (serta ifsyarat) mengambil nilai kembali nol sebagai "benar", dan semua yang lain sebagai "salah". (* atau daftar beberapa perintah, yang terakhir diperhitungkan)

Adapun :, manual Bash memberi tahu dengan jelas apa status pengembalian itu:

: [arguments]
Jangan lakukan apa pun selain memperluas argumen dan melakukan pengalihan. Status pengembalian adalah nol.

The helpbuiltin bahkan lebih jelas:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.
ilkkachu
sumber
s/any command/any sequence of commands/, seperti yang dijelaskan Stéphane.
Toby Speight