Отрицать, пока состояние петли в bash

25

В части сценария, над которым я работаю, я хочу проверить, что введенный IP-адрес имеет правильный формат. Я хочу сделать цикл, пока формат ввода НЕ правильный. Следующее работает для цикла, пока формат правильный.

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

Как я могу перевернуть это, чтобы сказать, не соответствует формату. Я надеялся, !=~что это сработает, но я получаю синтаксическую ошибку.

Synner
источник
2
Синер, одно предостережение: хотя очевидно, что вы пишете интерактивный сценарий, огромные возможности сценариев оболочки заключаются в возможности делать одно и то же с одним и тем же сценарием как в интерактивном режиме, так и в пакетном режиме. В будущем будет определенно легче (когда вы начнете использовать скрипт в качестве строительного блока) просто ввести параметры в командной строке и немедленно вернуться с ненулевым кодом выхода (и сообщением), если что-то не так. Только мои 2 цента ...
Охотник на оленей

Ответы:

60

Решение очень простое, я уверен, что вам все покажется смешным.

Не нужно беспокоиться о деталях синтаксиса отрицания, просто используйте untilвместо while.

lynxlynxlynx
источник
9

Для сравнения строки следует использовать !=вместо !=~.

От man bash

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

Поскольку вы используете регулярное выражение справа, вам действительно нужно =~. Вы можете отрицать все выражение.

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

Пример:

$ 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
$ 
Бернхард
источник
Спасибо за быстрые ответы. Я пытался сделать это перед публикацией, и это не правильно проверить. Кажется, для правильной работы ~ необходимо проверить, соответствует ли он формату.
Синнер
@Synner Проверьте редактирование
Бернхард
Не работает с bash4.2.42. pastebin.com/0vHh5MMB
manatwork
1
@manatwork Попробуйте в неинтерактивной оболочке.
Бернхард
@manatwork См. мое редактирование
Бернхард