Негативні умови циклу в bash


25

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

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

Як я можу це змінити, щоб сказати, НЕ відповідає формату. Я сподівався, що !=~це спрацює, але я отримую синтаксичну помилку.


2
Synner, одна нота обережності: хоча зрозуміло, що ви пишете інтерактивний сценарій, величезна сила сценаріїв оболонок походить від того, що можна робити те ж саме з тим самим сценарієм як в інтерактивному, так і в пакетному режимі. В майбутньому, безумовно, буде простіше (коли ви почнете використовувати сценарій як будівельний блок) просто ввести параметри в командному рядку та негайно повернутися з ненульовим кодом виходу (та повідомленням), якщо щось не так. Тільки мої 2 копійки…
Мисливець на олень

Відповіді:


60

Рішення таке просте, я впевнений, що вам все це буде смішно.

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


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
манатура

1
@manatwork Спробуйте в неінтерактивній оболонці.
Бернхард

@manatwork Дивіться мою редакцію
Бернхард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.