bash 정규식 무효화 [닫기]

bash 정규식 무효화 [닫기]

변수가 hn유효한 숫자 정수가 아닌 경우 오류를 감지하기 위해 다음 패턴 일치 조건을 사용하고 있습니다.

! [[ "$hn" =~ ^[[:digit:]]+$ ]] && errcode=13

하지만 난 이해해

bash: /home/flora/int.sh: line 1184: syntax error near unexpected token ! bash: /home/flora/int.sh: line 1184: if ! [[ "$hn" =~ ^[[:digit:]]+$ ]]; then'

답변1

! [[ "$hn" =~ ^[[:digit:]]+$ ]] && errcode=13

문법적으로 유효합니다 bash. 이는 (파이프라인 실행 및 상태 무효화) 및 스칼라 변수 할당을 포함하는 cmd1 && cmd2명령 목록 입니다 . 조건식을 평가하는 데 사용되는 특수 복합 명령 입니다 . 그 안에 올바르게 분리된 태그가 3개 있습니다. 두 번째는 정규식 일치를 확장하는 데 사용되는 연산자입니다. 세 번째 문자 그대로의 의미는 사용된 정규식입니다. 정규식으로 항목의 시작 부분과 항목의 끝 부분 이후에 로케일에서 숫자로 분류된 하나 이상의 문자와 일치합니다.cmd1! pipelinecmd2pipeline[[ ... ]]=~

bashPOSIX 모드에서도 여전히 유효한 것으로 간주됩니다.

POSIX sh에서는 동작이 [[일부용으로 예약되어 있으므로 지정되지 않습니다.명시되지 않은행동. [[특수 키워드가 없는 POSIX sh 구현에서는 구문적으로 여전히 유효합니다(따옴표가 없는 부분을 제외하면 다음과 $같이 입력하게 될 수 있음).명시되지 않은[[지역), 그러나 명령을 찾을 수 없다는 오류가 발생할 수 있습니다.

unexpected token !당신 이 들어간다 는 사실은 if ! [[ "$hn" =~ ^[[:digit:]]+$ ]]; then명령이 필요하지 않은 컨텍스트에서 코드가 발견되었음을 나타냅니다. 예를 들어, 이는 문 중간에 caseor 패턴이 대신 나타나기 때문일 수 있습니다(이 패턴은 패턴으로 허용되지만 파서가 or 토큰을 기대하기 때문에 다음 토큰은 예상치 못한 것입니다).esacifcase!|)

이제 부정적인 정규식 일치로 돌아갑니다. 예, 모든 명령은 무효화 ! [[ "$var" =~ $regexp ]]될 수 있습니다(실제로는!관로) 그 내용을 포함합니다. !조건식 연산자를 사용할 수도 있습니다 : [[ ! "$var" =~ $regexp ]].

그러나 이 명령 은 's (아마 awk's에서 영감을 받은 것 같습니다 ) 에서 영감을 =~받은 것처럼 보이지만 's(또는 's) 연산자는 지원되지 않습니다.perl=~~perlawk!~

특정 정규식에 관해서는자세한 설명은 다른 Q&A에서, 아랍어 십진수만 허용하려면 일반적으로 [0-9]또는 과 같은 입력 유효성 검사를 피해야 합니다.[[:digit:]]0123456789

그래서:

[[ ! "$hn" =~ ^[0123456789]+$ ]]

또는 (정규식 대신 glob 패턴 사용):

[[ "$hn" != +([0123456789]) ]]

shopt -s extglob(이전 버전에서는 ksh 확장 glob을 인식해야 합니다 bash. +(...))

더 좋아질 것입니다.

표준 sh구문에서:

case "$hn" in
  ('' | *[!0123456789]*) true;;
  (*) false;;
esac

019어떤 경우에는 8진수로 해석되거나(예: 일부 숫자에 오류가 발생함 ) 선행 0(0 자체 제외)이 있는 숫자를 거부하거나 내용에서 지원하는 것보다 큰 숫자를 거부할 수도 있습니다. 사용됩니다.

관련 정보