Saya memiliki skrip dan ingin meminta informasi kepada pengguna, skrip tidak dapat dilanjutkan sampai pengguna mengisi informasi ini. Berikut ini adalah upaya saya untuk menempatkan perintah dalam satu lingkaran untuk mencapai ini tetapi tidak berhasil karena suatu alasan.
echo "Please change password"
while passwd
do
echo "Try again"
done
Saya telah mencoba banyak variasi loop sementara:
while `passwd`
while [[ "`passwd`" -gt 0 ]]
while [ `passwd` -ne 0 ]]
# ... And much more
Tapi sepertinya saya tidak bisa membuatnya bekerja.
until passwd; do echo "Try again"; sleep 2; done
- yang harus Anda lakukan adalah tekan Ctr-C tepat setelah (dalam dua detik diberikan) yangecho
melakukan pekerjaan itu.until passwd || (( count++ >= 5 )); do echo "foo"; done
(hanya bash, pastikan untuk menetapkan hitungan ke 0 jika itu tidak ada). Jika Anda membutuhkan ini untuk sh polos, tambahkan penghitung di tubuh dan gunakan []Anda perlu menguji
$?
sebagai gantinya, yang merupakan status keluar dari perintah sebelumnya.passwd
keluar dengan 0 jika semuanya berfungsi dengan baik, dan bukan nol jika perubahan passwd gagal (kata sandi salah, kata sandi salah, dll ...)Dengan versi backtick Anda, Anda membandingkan output passwd, yang akan berupa hal-hal seperti
Enter password
danconfirm password
dan sejenisnya.sumber
$?
?passwd
dengan/bin/false
jika Anda memiliki beberapa perintah yang panjang dan rumit yang Anda tidak ingin menyimpan dua versi.Untuk menguraikan jawaban @Marc B,
Adalah cara yang baik untuk melakukan hal yang sama yang tidak spesifik perintah.
sumber
sudo
di depan perintah, Anda bisa melakukannyasudo !!
untuk menjalankan perintah sebelumnya dengan hak akses root.Anda dapat menggunakan loop tak terbatas untuk mencapai ini:
sumber
&& break
setelah perintah verifikasi saya alih-alih kasus pilih.Jika ada yang ingin mencoba lagi:
sumber
until $(command)
pada dasarnya selalu salah. Gunakanuntil command
sebagai gantinya. The$(...)
menyebabkan keluaran daricommand
menjadi dirinya sendiri dijalankan sebagai perintah, dan status keluar dari bahwa perintah sekunder menjadi apa loop memutuskan untuk menjalankan atau gagal pada; itu hanya jika ada adalah tidak ada stdout bahwa status keluar dari perintah itu sendiri dianggap ketika substitusi perintah hadir.$command
juga bukan pengganti yang bagus - lihat BashFAQ # 50 tentang mengapa menggunakan string untuk menyimpan perintah secara bawaan tidak dapat diandalkan. Namun, ini lebih baik daripada sebelumnya; downvote ditarik.sumber