이는 구문상 잘못되었습니다.
#!/usr/bin/env bash
dimension="4x5"
if [[ "$dimension" !=~ '[0-9]x[0-9]' ]]; then
echo 'wtf meng, the dimension needs an "x" in it.'
return 1;
fi
위의 구문은 잘못되었습니다. 그래서 제 질문은 - 할 수 있는 방법이 있습니까?!=~
...그럴 것 같은데요 !~
? 그것이 사실이라면 부정 규칙에 대한 내용은 이만큼입니다. 그렇군요.. 테스트해봤는데 !~
역시 작동하지 않네요..
답변1
키워드 에 !=~
or 연산자 가 없습니다 . 대신 비교 결과를 무효화하세요.!~
[[
[[ ! "string" =~ regex ]]
주장 인용 과 관련하여 regex
매뉴얼에는 다음과 같이 명시되어 있습니다.
패턴의 일부를 인용하여 인용된 부분을 문자열로 일치시킬 수 있습니다.
regex
따라서 쉘 옵션이 compat31
설정 되지 않은 한 정규식 부분을 인용해서는 안 됩니다.
shopt
...compat31
[[
설정된 경우 bash는 조건부 명령=~
연산자 에 대한 인용된 인수와 관련하여 동작을 버전 3.1의 동작으로 변경합니다.
주어진 예에서는 다음을 시도해 보십시오.
if [[ ! "$dimension" =~ ^[0123456789]+x[0123456789]+$ ]]; then
printf '%s %s\n' "'$dimension'" 'is not a valid dimension.'
fi
regex
으로 고정되어야 하며^...$
, 그렇지 않으면foo1x1fubar
유효한 치수로 간주됩니다.
또한 입력 유효성 검사와 같은 범위를 사용하지 마십시오 0-9
. 특히 많은 로케일에서와 같이 보안에 민감한 컨텍스트에서 삭제를 위한 경우 이러한 범위에는 역사적으로 그랬던 것보다 훨씬 더 많은 문자(또는 여러 문자로 구성된 요소를 대조하는 요소)가 포함됩니다. 여전히 C/POSIX 로케일에서 수행됩니다).
의 경우 =~
여기서는 도움이 bash
되지 globasciiranges
않습니다. Ubuntu 19.10 및 로케일에서 0123456789 외에 1040개의 다른 문자와 일치하는 것을 en_GB.UTF-8
발견했습니다 . 적어도 내 경우에는 모두 0에서 8까지의 십진수와 어떤 관계가 있지만 일반적으로 보장되지는 않습니다.bash
[0-9]
globasciiranges
반면에 [[:digit:]]
and는 [0123456789]
해당 10개에서만 일치하며 모든 POSIX 호환 시스템에서 사용해야 합니다.
sh
다음과 같은 표준 구문과 와일드카드 패턴을 사용하여 이를 수행할 수도 있습니다 .
valid_geometry() case $1 in
(*[!x0123456789]* | *x | x* | *x*x*) false;;
(*x*) true;;
(*) false;;
esac
if ! valid_geometry "$dimension"; then
...
fi
또는 다음 을 사용하여 ksh glob을 사용합니다( 및 에서도 bash -O extglob
지원됨 bash
) .[[
extglob
if [[ $dimension != +([0123456789])x+([0123456789]) ]]; then
...
fi
답변2
좋아요, 이것이 작동하는 것 같습니다:
if [[ ! "$dimension" =~ [0-9]+x[0-9]+ ]]; then
echo 'wtf meng, the dimension needs an "x" in it.'
exit 1;
fi
그런데 왜 작은따옴표로 묶는 것이 작동하지 않는지 궁금합니다.
if [[ ! "$dimension" =~ '[0-9]+x[0-9]+' ]]; then
echo 'wtf meng, the dimension needs an "x" in it.'
exit 1;
fi
내 해결책은 다음과 같습니다.
dimension="3x5"
regex='[0-9]+x[0-9]+'
if [[ ! "$dimension" =~ $regex ]]; then
echo 'wtf meng, the dimension needs an "x" in it.'
exit 1;
fi
이제 작은따옴표를 사용하여 정규식을 인용할 수 있지만 [[ ]] 내에서 $regex를 참조할 때는 큰따옴표를 피해야 합니다. 그러나 ..의 약어가 있는지 여전히 궁금합니다 [0-9]+
.