변수가 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
! pipeline
cmd2
pipeline
[[ ... ]]
=~
bash
POSIX 모드에서도 여전히 유효한 것으로 간주됩니다.
POSIX sh에서는 동작이 [[
일부용으로 예약되어 있으므로 지정되지 않습니다.명시되지 않은행동. [[
특수 키워드가 없는 POSIX sh 구현에서는 구문적으로 여전히 유효합니다(따옴표가 없는 부분을 제외하면 다음과 $
같이 입력하게 될 수 있음).명시되지 않은[[
지역), 그러나 명령을 찾을 수 없다는 오류가 발생할 수 있습니다.
unexpected token !
당신 이 들어간다 는 사실은 if ! [[ "$hn" =~ ^[[:digit:]]+$ ]]; then
명령이 필요하지 않은 컨텍스트에서 코드가 발견되었음을 나타냅니다. 예를 들어, 이는 문 중간에 case
or 패턴이 대신 나타나기 때문일 수 있습니다(이 패턴은 패턴으로 허용되지만 파서가 or 토큰을 기대하기 때문에 다음 토큰은 예상치 못한 것입니다).esac
if
case
!
|
)
이제 부정적인 정규식 일치로 돌아갑니다. 예, 모든 명령은 무효화 ! [[ "$var" =~ $regexp ]]
될 수 있습니다(실제로는!
관로) 그 내용을 포함합니다. !
조건식 연산자를 사용할 수도 있습니다 : [[ ! "$var" =~ $regexp ]]
.
그러나 이 명령 은 's (아마 awk's에서 영감을 받은 것 같습니다 ) 에서 영감을 =~
받은 것처럼 보이지만 's(또는 's) 연산자는 지원되지 않습니다.perl
=~
~
perl
awk
!~
특정 정규식에 관해서는자세한 설명은 다른 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 자체 제외)이 있는 숫자를 거부하거나 내용에서 지원하는 것보다 큰 숫자를 거부할 수도 있습니다. 사용됩니다.