bash의 부정 루프 상태


25

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

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

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


2
Synner, 한 가지주의 사항 : 대화식 스크립트를 작성하는 것이 확실하지만 쉘 스크립트의 강력한 기능은 대화식 및 배치 모드에서 동일한 스크립트를 사용하여 동일한 작업을 수행 할 수 있다는 것입니다. 미래에 (스크립트를 빌딩 블록으로 사용하기 시작할 때) 확실히 명령 줄에 옵션을 입력하고 잘못된 것이 있으면 0이 아닌 종료 코드 (및 메시지)와 함께 즉시 반환하는 것이 훨씬 쉬울 것입니다. 그냥 내 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

@Synner 편집 확인
Bernhard

bash4.2.42에서는 작동하지 않습니다 . pastebin.com/0vHh5MMB
manatwork

1
@manatwork 비 대화식 쉘을 사용해보십시오.
Bernhard

@manatwork 내 편집 내용보기
Bernhard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.