Bash에서 while 루프 조건 부정

Bash에서 while 루프 조건 부정

제가 작성 중인 스크립트의 일부에서 입력된 IP 주소가 올바른 형식인지 확인하고 싶습니다. 입력 형식이 올바르지 않을 때 반복하고 싶습니다. 다음은 형식이 올바르게 지정된 경우 루프에 대해 작동합니다.

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

이것을 어떻게 뒤집어서 형식에 맞지 않는다고 말할 수 있습니까? !=~작동 하길 바라지 만 구문 오류가 발생합니다.

답변1

해결책은 매우 간단하며 여러분 모두가 흥미로울 것이라고 확신합니다.

부정 구문 세부 사항에 대해 걱정할 필요가 없습니다 . until대신에 를 사용하세요 while.

답변2

문자열을 비교하려면 를 !=사용해야 합니다 !=~.

~에서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
$ 

답변3

명령문 앞에 "!"를 입력하세요. 예를 들면 다음과 같습니다.

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

관련 정보