Phủ định điều kiện vòng lặp trong bash


25

Trong một phần của tập lệnh mà tôi đang làm việc, tôi muốn xác thực rằng địa chỉ IP được nhập vào có định dạng chính xác. Tôi muốn tạo một vòng lặp trong khi định dạng đầu vào KHÔNG chính xác. Sau đây hoạt động cho một vòng lặp trong khi định dạng IS chính xác.

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

Làm thế nào tôi có thể xoay cái này để nói KHÔNG phù hợp với định dạng. Tôi đã hy vọng !=~sẽ làm việc, nhưng tôi nhận được một lỗi cú pháp.


2
Synner, một lưu ý: trong khi rõ ràng là bạn đang viết một kịch bản tương tác, sức mạnh to lớn của kịch bản shell đến từ việc có thể làm điều tương tự với cùng một kịch bản cả trong tương tác lẫn trong chế độ hàng loạt. Trong tương lai chắc chắn sẽ dễ dàng hơn (khi bạn bắt đầu sử dụng tập lệnh làm khối xây dựng) chỉ cần nhập các tùy chọn trong dòng lệnh và trả về ngay lập tức với mã thoát khác không (và tin nhắn) nếu có gì sai. Chỉ cần 2 xu của tôi ...
Deer Hunter

Câu trả lời:


60

Giải pháp rất đơn giản, tôi chắc chắn tất cả các bạn sẽ thấy nó hài hước.

Không cần phải làm việc về chi tiết cú pháp phủ định, chỉ cần sử dụng untilthay vì while.


9

Để so sánh chuỗi, người ta nên sử dụng !=thay vì !=~.

Từ man bash

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

Khi bạn đang sử dụng một biểu thức chính quy ở bên phải, bạn thực sự cần =~. Bạn có thể chọn để phủ định toàn bộ biểu thức.

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

Thí dụ:

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

Cảm ơn đã phản ứng nhanh chóng. Tôi đã thử điều đó trước khi đăng và nó không xác thực. Có vẻ như cần ~ để hoạt động đúng khi xác thực rằng nó KHÔNG phù hợp với định dạng.
Synner 16/03/13

@Synner Kiểm tra bản chỉnh sửa
Bernhard

Không hoạt động với bash4.2.42. pastebin.com/0vHh5MMB
manatwork 17/03 '

1
@manatwork Hãy thử trong một vỏ không tương tác.
Bernhard

@manatwork Xem bản chỉnh sửa của tôi
Bernhard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.