سؤال
التعليمة البرمجية التالية
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) هو المكان للبحث كاملة الأوصاف.
- الميزات الجديدة في باش
قص
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
$