제가 작성 중인 스크립트의 일부에서 입력된 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