bash의 부정 루프 상태 입력 형식이 올바르지 않은 동안 루프를 만들고

작업중 인 스크립트의 일부로 입력 된 IP 주소가 올바른 형식인지 확인하고 싶습니다. 입력 형식이 올바르지 않은 동안 루프를 만들고 싶습니다. 다음은 형식이 올바른 루프에서 작동합니다.

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

형식이 맞지 않는다고 말하기 위해 어떻게 이것을 바꿀 수 있습니까? 나는 효과가 있기를 바랐 !=~지만 구문 오류가 발생했습니다.



답변

해결책은 매우 간단합니다. 모두 재미있을 것입니다.

부정 구문 세부 사항에 대해 작업 할 필요가 없습니다 . until대신을 사용하십시오 while.


답변

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

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