Daha
Bash betiğinde bir kullanıcıdan nasıl onay isterim?
Potansiyel olarak tehlikeli bir bash betiğinin en üstüne hızlı bir "emin misiniz? " onay istemi koymak istiyorum, bunu yapmanın en kolay/en iyi yolu nedir?
558
3
levislevis85**'in önerisini uyguladım (teşekkürler!) ve Enter tuşuna basmaya gerek kalmadan bir karakter kabul etmek için
read
seçeneğine-n
seçeneğini ekledim. Bunlardan birini ya da ikisini birden kullanabilirsiniz.Ayrıca, olumsuzlanmış form şu şekilde görünebilir:
Ancak, Erich'in de belirttiği gibi, betiğin yanlış kabukta çalıştırılmasından kaynaklanan bir sözdizimi hatası gibi bazı durumlarda, olumsuzlanmış form betiğin "tehlikeli şeyler"'e devam etmesine izin verebilir. Hata modu en güvenli sonucu tercih etmelidir, bu nedenle yalnızca ilk, olumsuzlanmamış
if
kullanılmalıdır.Açıklama:
Read
komutu komut isteminin çıktısını verir (
-p "prompt"), ardından bir karakter kabul eder (
-n 1) ve ters eğik çizgileri tam anlamıyla kabul eder (
-r) (aksi takdirde
readters eğik çizgiyi bir kaçış olarak görür ve ikinci bir karakter bekler). Eğer böyle bir isim vermezseniz,
readiçin sonucu saklayacağı varsayılan değişken
$REPLYdir:
read -p "my prompt" -n 1 -r my_var`if
deyimi,
$REPLYiçindeki karakterin büyük veya küçük harf "Y" ile eşleşip eşleşmediğini (
=~) kontrol etmek için düzenli bir ifade kullanır. Burada kullanılan düzenli ifade " (
^) ile başlayan ve yalnızca bir ayraç ifadesindeki (
[Yy]) karakter listesinden birinden oluşan ve (
$) ile biten bir dize " der. Çapalar (
^ve
$) daha uzun dizelerin eşleşmesini engeller. Bu durumda,
read` komutunda belirlenen bir karakterlik sınırı güçlendirmeye yardımcı olurlar.Olumsuzlanmış form, "Y" veya "y" olmayan herhangi bir karakteri eşleştirmek (
=~
) için mantıksal "not" operatörünü (!
) kullanır. Bunu ifade etmenin alternatif bir yolu daha az okunabilir ve bence bu durumda amacı açıkça ifade etmiyor. Bununla birlikte, bu şekilde görünecektir:if [[ $REPLY =~ ^[^Yy]$ ]]
qnd: kullan
satır okuma desteği olmayan tek satırlık bir yanıt için. Ardından $VARNAME'i istediğiniz gibi test edin.