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?

Çözüm
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 takdirdereadters 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]$ ]]

Yorumlar (45)

qnd: kullan

read VARNAME
echo $VARNAME

satır okuma desteği olmayan tek satırlık bir yanıt için. Ardından $VARNAME'i istediğiniz gibi test edin.

Yorumlar (0)
echo are you sure?
read x
if [ "$x" = "yes" ]
then
  # do the dangerous stuff
fi
Yorumlar (0)