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?
read -p "Emin misiniz? " -n 1 -r
echo # (isteğe bağlı) yeni bir satıra geç
if [[ $REPLY =~ ^[Yy]$ ]]
sonra
# tehlikeli şeyler yap
fi
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:
read -p "Emin misiniz? " -n 1 -r
echo # (isteğe bağlı) yeni bir satıra geç
eğer [[ ! $REPLY =~ ^[Yy]$ ]]
sonra
[[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 # kabuktan veya işlevden çıkışları ele alır ancak etkileşimli kabuktan çıkmaz
fi
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:
Readkomutu 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`
ifdeyimi,
$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]$ ]]