سؤال

التعليمة البرمجية التالية

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

يعمل.إذا حاولت استخدام علامات الاقتباس في regex ، ومع ذلك ، فإنه يتوقف:

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

حاولت "\[0-9\]", أيضا.ما أنا في عداد المفقودين ؟

يكفي تهريج ، باش البرمجة المتقدمة دليل يشير إلى أن هذا العمل.

باش النسخة 3.2.39.

هل كانت مفيدة؟

المحلول

تم تغييره بين 3.1 و 3.2.تخمين الدليل المتقدم يحتاج إلى تحديث.

هذا هو وصف مقتضب من جديد الميزات المضافة إلى باش-3.2 منذ إطلاق باش-3.1.كما هو الحال دائما ، دليل الصفحة (doc/باش.1) هو المكان للبحث كاملة الأوصاف.

  1. الميزات الجديدة في باش

قص

f.نقلا عن سلسلة حجة على [[ الأمر =~ المشغل الآن قوات سلسلة مطابقة ، كما هو الحال مع غيرها من نمط مطابقة المشغلين.

للأسف هذا سوف كسر القائمة اقتباس باستخدام البرامج النصية إلا إذا كان لديك فكرة لتخزين أنماط المتغيرات واستخدامها بدلا من regexes مباشرة.المثال أدناه.

$ 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

نصائح أخرى

باش 3.2 قدم خيار التوافق compat31 الذي يعود باش التعبير العادي نقلا عن السلوك مرة أخرى إلى 3.1

دون 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

غنو باش الإصدار 4.2.25(1)-إطلاق سراح (x86_64-pc-linux-gnu)

بعض الأمثلة من السلسلة مباراة regex المباراة

    $ 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