이는 구문상 올바르지 않습니다.
#!/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
위의 구문은 끔찍합니다... 그래서 제 질문은 - 그것을 할 수 있는 방법이 있습니까?!=~
...그런 것 같아요 !~
? 이것이 사실이라면 부정 규칙 lulz에 대해서는 이만큼입니다. 네, 테스트해봤는데 !~
작동하지 않더군요...
답변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 및 en_GB.UTF-8
로케일에서는 0123456789 외에도 bash
. 적어도 내 경우에는 모두 0부터 8까지의 십진수와 어떤 관계가 있지만 일반적으로 이것이 보장되지는 않습니다.[0-9]
globasciiranges
반면에 는 이 10개만 일치 [[:digit:]]
하며 [0123456789]
모든 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]+
약어가 있는지 여전히 궁금합니다 .