什么[[$ strin = * [!0-9] *]]在bash中意味着什么?

时间:2015-06-16 17:57:40

标签: regex linux bash

我正在学习bash,特别是正则表达式,我在书中发现了这一点:

read strin

if [[ $strin = *[!0-9]* ]]; then

   echo "error"

else
   echo "success"

fi

我的问题是我不明白这个正则表达式意味着什么,特别是我不明白'!'范围中。

4 个答案:

答案 0 :(得分:2)

这是模式匹配的一个例子。如果string的值由0个或更多字符组成,后跟<0>范围内不是的单个字符(即非数字字符),则成功零个或多个任意字符。简而言之,模式匹配包含至少一个非数字字符的任何内容。

答案 1 :(得分:1)

来自Bash Reference Manual

  

[[...]]

     

[[表达]]   ....

     

当使用'=='和'!='运算符时,运算符右侧的字符串被视为一个模式,并根据下面Pattern Matching中描述的规则进行匹配,就像extglob shell一样选项已启用。 '='运算符与'=='相同。 ....可以引用模式的任何部分以强制引用的部分匹配为字符串。

关于模式匹配(强调我的):

  

3.5.8.1模式匹配

     

除了下面描述的特殊模式字符之外,模式中出现的任何字符都与自身匹配。 NUL字符可能不会出现在模式中。反斜杠会逃避以下字符;匹配时丢弃转义反斜杠。如果要按字面匹配,则必须引用特殊模式字符。

     

特殊模式字符具有以下含义:

...

  

[...]   匹配任何一个包含的字符。用连字符分隔的一对字符表示范围表达式;使用当前区域设置的整理顺序和字符集匹配这两个字符之间的任何字符(包括在内)。 如果'['之后的第一个字符是'!'或'^',那么任何未包含的字符都会匹配。 A' - '可以通过将其包含为第一个或最后一个字符来匹配在集合中。可以通过将它包括在集合中的第一个字符来匹配“]。范围表达式中字符的排序顺序由当前语言环境以及LC_COLLATE和LC_ALL shell变量的值决定(如果已设置)。

答案 2 :(得分:1)

关于模式匹配的POSIX shell规范:http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_13

首先,在星号上:

  

*   星号是一种匹配多个字符的模式,如模式匹配多个字符中所述。

然后,在[!0-9]

  

IEEE Std 1003.1-2001的基本定义卷中的基本正则表达式括号表达式的说明,第9.3.5节,RE括号表达式也应适用于模式括号表达式,但感叹号字符除外(&#39 ;'&#39;)将替换在#34;非匹配列表中的旋律字符(&#39; ^&#39;)&#34;在正则表达式表示法中。以不带引号的抑扬符号开头的括号表达式会产生未指定的结果。

也就是说:[!x]表示与[^x]在POSIX BRE正则表达式中的含义相同 - 反转字符类以匹配不在其中的任何字符。

要查看上面引用的POSIX BRE规范(http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_03_05):

  

在POSIX语言环境中,范围表达式表示在整理顺序中包含两个元素之间的整理元素集。在其他语言环境中,范围表达式具有未指定的行为:严格符合的应用程序不应依赖范围表达式是否有效,还是依赖于匹配的整理元素集。范围表达式应表示为以连字符分隔的起点和终点(&#39; - &#39;)。

也就是说,连字符表达式包括起点和终点之间的字符,但这可以通过区域设置区域设置的排序顺序进行修改,使[0-9]表达式匹配数字,尽管不好练习与[[:digit:]]相比。

结合上述部分,这意味着[!0-9]匹配不是数字的任何字符。

答案 3 :(得分:1)

这是一种模式,而不是正则表达式。这是显示差异的reference

模式与[[ $var = pattern ]]匹配,使用[[ $var =~ regex ]]匹配正则表达式。

以下正则表达式匹配将等同于您的代码:

if [[ $strin =~ [^0-9] ]]; then