Bagaimana cara menjalankan perintah dan mendapatkan kode keluarnya dalam lebih sedikit karakter?


13

Saya biasa menulis skrip saya seperti ini:

some_command
while [ $? -ne 0 ] ; do
    sleep 1
    some_command
done

Itu selalu membuatku kesal bahwa aku harus menulis some_commanddua kali. Bisakah saya memasukkannya ke dalam bagian tes loop?

Jawaban:


20

Anda dapat menggunakannya some_commandsebagai kondisi pengujian Anda.

while ! some_command; do sleep 1; done

Kondisi akan tetap benar selama some_commandkeluar dengan kesalahan.

Atau dengan cara yang lebih jelas jika Anda ingin melakukan pemeriksaan tambahan:

while ! some_command
do 
    # add more if desired
    sleep 1
done

Ini terlihat lebih baik daripada milikku, meskipun itu adalah satu-liner ;-)
Anthon

OP mungkin ingin membaginya menjadi beberapa baris jika dia perlu mengeksekusi beberapa perintah setelah kegagalan :)
John WH Smith

Tidak ada alasan mengapa Anda tidak dapat memecah baris di semi-titik dua untuk membuatnya multi-line.
Mark Stewart

1
... atau tuliswhile ! some_command; do several; commands; sleep 1; done
ignis

12

Inilah untilgunanya loop:

until some_command
do    sleep 1
done

Ini adalah negasi logis dari sebuah whileloop.

The Spec mengatakan:

The untilloop

  • The untilLoop akan terus menjalankan salah satu senyawa-daftar asalkan lain senyawa-daftar memiliki status exit non-nol.

  • Format loop sampai adalah sebagai berikut:

    hingga compound-list-1
    lakukan compound-list-2
    selesai
  • The senyawa-list-1 akan dieksekusi, dan jika memiliki status nol keluar, yang untilperintah selesai. Jika tidak, senyawa-daftar-2 harus dieksekusi, dan proses berulang.

4

Anda bisa melakukannya:

false
while [ $? -ne 0 ] ; do
   sleep 1
   some_command
done

ini memiliki kekurangan meskipun selalu tidur satu detik lebih dulu

Jika Anda ingin dapat keluar dari salah satu dari sejumlah perintah untuk keluar dengan 0, Anda dapat melakukannya:

while true; do
  if [ some_command ] ; then break ; fi
  if [ some_other_command ] ; then break ; fi
  sleep 1
done

yang tentu saja juga bekerja dengan adil some_command


5
Contoh kedua seharusnya tidak termasuk [dan ]sekitar perintah.
nyuszika7h

2

Baik while ! ...atau until ...bekerja pada sistem yang membeku lingkungan shell mereka sebelum POSIX.1-2001. Namun, ini tidak.

while :; do
    if some command; then
        break
    fi
    sleep 1
done

Jika Anda tidak membutuhkan portabilitas total, mengapa Anda menulis skrip shell? Perl lebih mungkin tersedia daripada Bash.

sleep 1 while 0 != system qw(some command);

(Seperti di atas, sleepini hanya dieksekusi jika perintah gagal.)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.