[[:space:]] 在 bash 中是什么意思?

ger*_*din 30 bash syntax

我刚刚遇到了一个 bash 脚本。[[:space:]]在 bash 脚本中是什么意思?为什么是双冒号?

Jef*_*ler 39

它确实在 bash 手册中,但它有助于了解您在寻找什么,如果您不知道自己在寻找什么,这无济于事。如果您进行搜索,[[您会被[[ expression ]]条件表达式部分分心。此外,在:space:同一部分下的两个示例中搜索土地。您可以按照该示例中的面包屑导航:

例如,如果值中存在由任意数字组成的字符序列(包括零、空格字符、零或 'a' 的一个实例),则以下将匹配一行(存储在 shell 变量 line 中),然后'乙':

[[ $line =~ [[:space:]]*?(a)b ]]
Run Code Online (Sandbox Code Playgroud)

...从中您可以拼凑出该[[:space:]]部分对应于“空格字符”,但您可以认为它只是一个字面空格字符而不是整类字符,这就是它所代表的含义,这是可以原谅的。

如果您(碰巧?)" space"在线 bash 手册中搜索字符串(即一个空格后跟单词“space”),则“仅”大约 32 个匹配项需要通过。关于第十个将在这里:

在 '[' 和 ']' 中,可以使用语法 [:class:] 指定字符类,其中 class 是 POSIX 标准中定义的以下类之一:

alnum   alpha   ascii   blank   cntrl   digit   graph   lower
print   punct   space   upper   word    xdigit
Run Code Online (Sandbox Code Playgroud)

字符类匹配属于该类的任何字符。

然后将带您到POSIX 标准,您可以在其中搜索术语“字符类”并找到

wctype, wctype_l - 定义字符类,它可以让你:

wctype() [CX] [Option Start] 和 wctype_l() [Option End] 函数应根据当前语言环境 [CX] [Option Start] 中字符类型信息定义的编码字符集的规则确定 wctype_t 的值或在locale 所代表的locale 中,分别为[Option End](类别LC_CTYPE)。

如果您随后访问了setlocale链接,您最终会在Locale 部分找到真正的答案:

空间

定义要归类为空白字符的字符。在 POSIX 语言环境中,<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>应准确包含在内。

在语言环境定义文件中,不应指定为关键字 upper、lower、alpha、digit、graph 或 xdigit 指定的字符。该<space>, <form-feed>, <newline>, <carriage-return>, <tab>, and <vertical-tab>便携式字符集,并包含在类空白的任何字符的自动包含在这个类。

  • @Isaac 我认为重点是教那个人如何钓鱼。也就是说,我不知道`less +"$cmd"`,所以谢谢你。 (5认同)
  • 事实上,我是从 OP 的角度回答的;他们可以原谅没有意识到外部的“[]”独立于内部的“[]”。我试图(!)找到一种从问题到答案的方法,但不知道*太多*关于答案是什么,尽管这需要一些幸运的猜测:) (3认同)

Nim*_*ima 19

它不仅适用于 Bash,它还是 POSIX 符号的一部分。

什么是POSIX?

POSIX 或“适用于 uniX 的便携式操作系统接口”是一组标准,用于定义 (UNIX) 操作系统应支持的某些功能。这些标准之一定义了两种风格的正则表达式。

POSIX 括号表达式

POSIX 括号表达式是一种特殊的字符类。POSIX 括号表达式匹配一组字符中的一个字符,就像常规字符类一样。

标准POSIX

[[:alnum:]]   Alphanumeric characters
[[:alpha:]]   Alphabetic characters
[[:blank:]]   Space and tab
[[:cntrl:]]   Control characters
[[:digit:]]   Digits
[[:graph:]]   Visible characters (anything except spaces and control characters)
[[:lower:]]   Lowercase letters
[[:print:]]   Visible characters and spaces (anything except control characters)
[[:punct:]]   Punctuation (and symbols).
[[:space:]]   All whitespace characters, including line breaks
[[:upper:]]   Uppercase letters
[[:xdigit:]]  Hexadecimal digits
Run Code Online (Sandbox Code Playgroud)

无标准

[[:ascii:]]   ASCII characters
[[:word:]]    Word characters (letters, numbers and underscores)
Run Code Online (Sandbox Code Playgroud)

遗留语法(有人可以找到对这些的引用吗?)

[[:<:]]       Start of Word 
[[:>:]]       End of Word
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到更多信息:wiki


ilk*_*chu 9

在正则表达式和文件名 globs/shell 模式中,该[...]构造匹配括号内列出的任何一个字符。在这些括号内,可以使用许多命名的标准字符字符类。其中之一是[:space:],它匹配空白字符(如\sPerl 正则表达式)。参见例如Bash 手册中的模式匹配

所以,[[:space:]]是正则表达式或模式匹配的一部分,只匹配空格。

例如模式匹配(标准外壳,不是 Bash 特定的):

case $var in 
    *[[:space:]]*) echo "'$var' contains whitespace";;
esac
Run Code Online (Sandbox Code Playgroud)

或正则表达式(Bash):

if [[ $var =~ [[:space:]] ]]; then
    echo "'$var' contains whitespace"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,即使支架表达式[...]的工作方式相同的正则表达式和外壳的图案,他们一般都非常一样的。(case[[ string == pattern ]]使用模式匹配,[[ string =~ regex ]]使用正则表达式。)

正则表达式还没有shell特定的,他们在如习惯awksed过了,在例如描述Linux手册页regex(7)