Saya mengalami masalah dengan kombinasi titik koma dan / atau kawat gigi yang tepat. Saya ingin melakukan ini, tetapi sebagai one-liner dari baris perintah:
while [ 1 ]
do
foo
sleep 2
done
Saya mengalami masalah dengan kombinasi titik koma dan / atau kawat gigi yang tepat. Saya ingin melakukan ini, tetapi sebagai one-liner dari baris perintah:
while [ 1 ]
do
foo
sleep 2
done
Jawaban:
while true; do foo; sleep 2; done
Ngomong-ngomong, jika Anda mengetiknya sebagai multiline (seperti yang Anda tunjukkan) di command prompt dan kemudian memanggil histori dengan panah ke atas, Anda akan mendapatkannya di satu baris, diselingi dengan benar.
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist
opsi jika Anda menggunakan bash?
while true; do sh /Users/myuser/bin/vpn ; done
Juga dimungkinkan untuk menggunakan perintah tidur dalam kondisi sementara. Membuat one-liner tampak lebih bersih.
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
Tentu saja jika perintah [while] gagal, loop keluar, jadi Anda harus while echo thinking || true ; do sleep 2 ; done
tetapi kemudian Anda kembali kewhile true ; ...
Usus selalu "benar":
while :; do foo; sleep 2; done
: [arguments]
Tidak ada efek; perintah tidak melakukan apa-apa selain memperluas argumen dan melakukan pengalihan tertentu. Kode keluar nol dikembalikan.
Anda dapat menggunakan titik koma untuk memisahkan pernyataan:
$ while [ 1 ]; do foo; sleep 2; done
Anda juga dapat menggunakan until
perintah:
until ((0)); do foo; sleep 2; done
Perhatikan bahwa berbeda dengan while
, until
akan menjalankan perintah di dalam loop selama kondisi tes memiliki status keluar yang tidak nol.
Menggunakan while
loop:
while read i; do foo; sleep 2; done < /dev/urandom
Menggunakan for
loop:
for ((;;)); do foo; sleep 2; done
Cara lain menggunakan until
:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; done
tampaknya tidak bekerja. Itu terus menerus tanpa batas.
Saya suka menggunakan titik koma hanya untuk pernyataan WHILE, dan operator && untuk membuat loop melakukan lebih dari satu hal ...
Jadi saya selalu melakukannya seperti ini
while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done
&&
dalam loop adalah sama seperti waktu lainnya sebenarnya bukan. Apakah Anda perlu hal kedua terjadi hanya jika yang pertama terjadi, kemudian gunakan yang &&
lain ;
cukup. Sungguh, Anda ingin menjaga isi loop itu pendek dan sederhana, idealnya hanya satu perintah, jadi fungsi atau skrip.
Untuk proses menonton sederhana gunakan watch
saja
Menggunakan while
:
while true; do echo 'while'; sleep 2s; done
Menggunakan for
Loop:
for ((;;)); do echo 'forloop'; sleep 2; done
Menggunakan Recursion
, (sedikit berbeda dari di atas, interupsi keyboard tidak akan menghentikannya)
list(){ echo 'recursion'; sleep 2; list; } && list;
Jika Anda ingin loop sementara berhenti setelah beberapa kondisi, dan foo
perintah Anda mengembalikan non-nol ketika kondisi ini terpenuhi maka Anda bisa mendapatkan loop untuk istirahat seperti ini:
while foo; do echo 'sleeping...'; sleep 5; done;
Misalnya, jika foo
perintahnya menghapus hal-hal dalam batch, dan mengembalikan 1 ketika tidak ada yang tersisa untuk dihapus.
Ini berfungsi dengan baik jika Anda memiliki skrip khusus yang perlu menjalankan perintah berkali-kali hingga beberapa syarat. Anda menulis skrip untuk keluar 1
saat kondisi terpenuhi dan keluar 0
saat harus dijalankan kembali.
Misalnya, Anda memiliki skrip python batch_update.py
yang memperbarui 100 baris dalam database dan mengembalikan 0
jika ada lebih banyak untuk memperbarui dan 1
jika tidak ada lagi. Perintah berikut akan memungkinkan Anda untuk memperbarui baris 100 sekaligus dengan tidur selama 5 detik antara pembaruan:
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
foo
perintah keluar dengan kode 1
saat Anda ingin loop sementara terputus. Saya telah memperbarui jawaban saya dengan sebuah contoh.
Jika saya bisa memberikan dua contoh praktis (dengan sedikit "emosi").
Ini menulis nama semua file yang diakhiri dengan ".jpg" di folder "img":
for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done
Ini menghapus mereka:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done
Hanya berusaha berkontribusi.
ls -1 *.jpg
danrm *.jpg
Anda dapat mencoba ini juga PERINGATAN: ini sebaiknya tidak Anda lakukan tetapi karena pertanyaannya adalah meminta infinite loop tanpa akhir ... ini adalah bagaimana Anda dapat melakukannya.
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done