문제

다음 코드

number=1
if [[ $number =~ [0-9] ]]
then
  echo matched
fi

공장.그러나 정규 표현식에서 따옴표를 사용하려고 하면 중지됩니다.

number=1
if [[ $number =~ "[0-9]" ]]
then
  echo matched
fi

나는 노력했다 "\[0-9\]", 도.내가 무엇을 놓치고 있나요?

충분히 재미있게, Bash 고급 스크립팅 가이드 이것이 작동해야 한다고 제안합니다.

배시 버전 3.2.39.

도움이 되었습니까?

해결책

변경되었습니다 3.1과 3.2 사이.고급 가이드에 업데이트가 필요한 것 같습니다.

이것은 BASH-3.1이 출시 된 이후 BASH-3.2에 추가 된 새로운 기능에 대한 간결한 설명입니다.항상 그렇듯이 매뉴얼 페이지 (Doc/Bash.1)는 완전한 설명을 찾을 수있는 곳입니다.

  1. Bash의 새로운 기능

한조각

에프.문자열 인수를 [[명령 = ~ 연산자는 이제 다른 패턴 매칭 연산자와 마찬가지로 문자열 일치를 강요합니다.

안타깝게도 변수에 패턴을 저장하고 정규 표현식 대신 패턴을 직접 사용하는 통찰력이 없으면 스크립트를 사용하여 기존 인용문이 깨집니다.아래 예.

$ bash --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
$ number=2
$ if [[ $number =~ "[0-9]" ]]; then echo match; fi
$ if [[ $number =~ [0-9] ]]; then echo match; fi
match
$ re="[0-9]"
$ if [[ $number =~ $re ]]; then echo MATCH; fi
MATCH

$ bash --version
GNU bash, version 3.00.0(1)-release (i586-suse-linux)
Copyright (C) 2004 Free Software Foundation, Inc.
$ number=2
$ if [[ $number =~ "[0-9]" ]]; then echo match; fi
match
$ if [[ "$number" =~ [0-9] ]]; then echo match; fi
match

다른 팁

Bash 3.2에는 bash 정규식 인용 동작을 3.1로 되돌리는 호환성 옵션 compat31이 도입되었습니다.

compat31이 없는 경우:

$ shopt -u compat31
$ shopt compat31
compat31        off
$ set -x
$ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi
+ [[ 9 =~ \[0-9] ]]
+ echo no match
no match

compat31 사용:

$ shopt -s compat31
+ shopt -s compat31
$ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi
+ [[ 9 =~ [0-9] ]]
+ echo match
match

패치 링크:http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-039

GNU bash, 버전 4.2.25(1)-릴리스(x86_64-pc-linux-gnu)

문자열 일치 및 정규식 일치의 몇 가지 예

    $ if [[ 234 =~ "[0-9]" ]]; then echo matches;  fi # string match
    $ 

    $ if [[ 234 =~ [0-9] ]]; then echo matches;  fi # regex natch 
    matches


    $ var="[0-9]"

    $ if [[ 234 =~ $var ]]; then echo matches;  fi # regex match
    matches


    $ if [[ 234 =~ "$var" ]]; then echo matches;  fi # string match after substituting $var as [0-9]

    $ if [[ 'rss$var919' =~ "$var" ]]; then echo matches;  fi   # string match after substituting $var as [0-9]

    $ if [[ 'rss$var919' =~ $var ]]; then echo matches;  fi # regex match after substituting $var as [0-9]
    matches


    $ if [[ "rss\$var919" =~ "$var" ]]; then echo matches;  fi # string match won't work

    $ if [[ "rss\\$var919" =~ "$var" ]]; then echo matches;  fi # string match won't work


    $ if [[ "rss'$var'""919" =~ "$var" ]]; then echo matches;  fi # $var is substituted on LHS & RHS and then string match happens 
    matches

    $ if [[ 'rss$var919' =~ "\$var" ]]; then echo matches;  fi # string match !
    matches



    $ if [[ 'rss$var919' =~ "$var" ]]; then echo matches;  fi # string match failed
    $ 

    $ if [[ 'rss$var919' =~ '$var' ]]; then echo matches;  fi # string match
    matches



    $ echo $var
    [0-9]

    $ 

    $ if [[ abc123def =~ "[0-9]" ]]; then echo matches;  fi

    $ if [[ abc123def =~ [0-9] ]]; then echo matches;  fi
    matches

    $ if [[ 'rss$var919' =~ '$var' ]]; then echo matches;  fi # string match due to single quotes on RHS $var matches $var
    matches


    $ if [[ 'rss$var919' =~ $var ]]; then echo matches;  fi # Regex match 
    matches
    $ if [[ 'rss$var' =~ $var ]]; then echo matches;  fi # Above e.g. really is regex match and not string match
    $


    $ if [[ 'rss$var919[0-9]' =~ "$var" ]]; then echo matches;  fi # string match RHS substituted and then matched
    matches

    $ if [[ 'rss$var919' =~ "'$var'" ]]; then echo matches;  fi # trying to string match '$var' fails


    $ if [[ '$var' =~ "'$var'" ]]; then echo matches;  fi # string match still fails as single quotes are omitted on RHS 

    $ if [[ \'$var\' =~ "'$var'" ]]; then echo matches;  fi # this string match works as single quotes are included now on RHS
    matches

다른 답변에서 언급했듯이 정규식을 변수에 넣는 것은 다른 항목에 대한 호환성을 달성하는 일반적인 방법입니다. 버전.조건식 내에서 정규식을 유지하면서 이 해결 방법을 사용하여 동일한 결과를 얻을 수도 있습니다.

$ number=1
$ if [[ $number =~ $(echo "[0-9]") ]]; then echo matched; fi
matched
$ 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top