Negasikan sementara kondisi loop di bash


25

Di bagian skrip yang sedang saya kerjakan, saya ingin memvalidasi bahwa alamat IP yang dimasukkan adalah dalam format yang benar. Saya ingin membuat perulangan sementara format input TIDAK benar. Berikut ini berfungsi untuk loop sementara format IS yang benar.

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

Bagaimana saya bisa membalikkan ini untuk mengatakan TIDAK cocok dengan format. Saya berharap !=~akan berhasil, tetapi saya mendapatkan kesalahan sintaksis.


2
Synner, satu nada peringatan: walaupun jelas bahwa Anda sedang menulis skrip interaktif, kekuatan skrip shell yang luar biasa berasal dari kemampuan untuk melakukan hal yang sama dengan skrip yang sama baik secara interaktif maupun dalam mode batch. Pasti akan lebih mudah di masa mendatang (ketika Anda mulai menggunakan skrip sebagai blok penyusun) untuk cukup memasukkan opsi di baris perintah dan segera kembali dengan kode keluar yang tidak nol (dan pesan) jika ada sesuatu yang salah. Hanya 2 sen saya ...
Deer Hunter

Jawaban:


60

Solusinya sangat sederhana, saya yakin Anda semua akan menganggapnya lucu.

Tidak perlu sibuk tentang detail sintaksis negasi, cukup gunakan untilsaja while.


9

Untuk perbandingan string, seseorang harus menggunakan !=sebagai ganti !=~.

Dari man bash

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

Ketika Anda menggunakan ekspresi reguler di sebelah kanan, Anda memang perlu =~. Anda dapat memilih untuk meniadakan seluruh ekspresi.

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

Contoh:

$ 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
$ 

Terima kasih atas tanggapan cepatnya. Saya sudah mencobanya sebelum memposting, dan itu tidak divalidasi dengan benar. Tampaknya perlu ~ untuk bekerja dengan baik juga ketika memvalidasi bahwa itu TIDAK sesuai dengan format.
Synner

@Synner Periksa hasil edit
Bernhard

Tidak berfungsi dengan bash4.2.42. pastebin.com/0vHh5MMB
manatwork

1
@manatwork Coba di shell yang tidak interaktif.
Bernhard

@manatwork Lihat hasil edit saya
Bernhard
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.