Bash'te döngü koşulu sırasındaki negatif


25

Üzerinde çalıştığım betiğin bir bölümünde, girilen IP adresinin doğru biçimde olduğunu doğrulamak istiyorum. Giriş formatı doğru değil iken bir döngü yapmak istiyorum. Format doğru iken aşağıdakiler bir döngü için çalışır.

while  [[  $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]
      do

Bunu nasıl döndürebilirim diyebilirim SÖZLEŞME. !=~İşe yarayacağını umuyordum , ancak sözdizimi hatası alıyorum.


2
Synner, bir uyarı notu: etkileşimli bir komut dosyası yazdığınız açık olsa da, kabuk komut dosyasının muazzam gücü, aynı komut dosyasıyla aynı şeyi hem etkileşimli olarak hem de toplu modda yapabilmekten gelir. Gelecekte (betiği bir yapı taşı olarak kullanmaya başladığınızda) komut satırındaki seçenekleri girmek ve bir şey yanlışsa derhal sıfır olmayan bir çıkış koduyla (ve bir mesajla) geri dönmek kesinlikle daha kolay olacaktır. Sadece benim 2 kuruş ...
Deer Hunter

Yanıtlar:


60

Çözüm çok basit, eminim hepsini komik bulacaksınız.

Gerek sadece kullanmak, olumsuzlama sözdizimi ayrıntıları hakkında kadar çalıştı için untilyerine while.


9

Dizenin karşılaştırılması için !=bunun yerine bir tane kullanılmalıdır !=~.

itibaren man bash

string1 != string2
          True if the strings are not equal.

Sağda düzenli bir ifade kullanıyorsanız, gerçekten ihtiyacınız var =~. Tüm ifadeyi reddetmeyi tercih edebilirsiniz.

while  [[  !( $range =~ ^[0-9]{1,3]}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]

Örnek:

$ bash --version | head -n1
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
$ cat script
range='1'; while [[ !( $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]; do echo "$range NOT OK"; range+='.2'; sleep 1; done
echo "Finished"
$ bash script
1 NOT OK
1.2 NOT OK
1.2.2 NOT OK
Finished
$ 

Hızlı cevaplar için teşekkürler. Bunu göndermeden önce denedim ve doğru şekilde doğrulamıyor. Bu formata uygun olduğunu doğrularken doğru şekilde çalışması gerekiyor.
Synner

@Synner Düzenlemeyi kontrol et
Bernhard

bash4.2.42 ile çalışmıyor. pastebin.com/0vHh5MMB
manatwork

1
@manatwork Etkileşimli olmayan bir kabukta deneyin.
Bernhard

@manatwork Düzenlememe bakın
Bernhard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.