Bash =~: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 6: Line 6:
The string to the right of the = ̃ operator is considered an extended regular expression and matched against the string to the left of the operator. The rules governing the extended regular expression are described in regex(3).
The string to the right of the = ̃ operator is considered an extended regular expression and matched against the string to the left of the operator. The rules governing the extended regular expression are described in regex(3).
<syntaxhighlight lang='bash'>
<syntaxhighlight lang='bash'>
if [["string_to_be_matched_against_regex" =~ regex ]]; then
if [[ "string_to_be_matched_against_regex" =~ regex ]]; then
   # match  
   # match  
else
else
Line 16: Line 16:
* The use of &#91;[...]] is required.
* The use of &#91;[...]] is required.
* ''DO NOT use double quotes when specifying the regular expression, just specify the regex literal directly.''
* ''DO NOT use double quotes when specifying the regular expression, just specify the regex literal directly.''
** Though I've seen problems when the regex contains spaces, this works:
<syntaxhighlight lang='bash'>
[[ "${output}" =~ "chart type".*"required" ]]
</syntaxhighlight>
* If the regular expression contains spaces, use single quotes to denote space:
* If the regular expression contains spaces, use single quotes to denote space:
<syntaxhighlight lang='bash'>
<syntaxhighlight lang='bash'>

Revision as of 21:36, 10 October 2019

Internal

Overview

The string to the right of the = ̃ operator is considered an extended regular expression and matched against the string to the left of the operator. The rules governing the extended regular expression are described in regex(3).

if [[ "string_to_be_matched_against_regex" =~ regex ]]; then
  # match 
else
  # no match 
fi

Usage is subject to the following constraints:

  • The use of [[...]] is required.
  • DO NOT use double quotes when specifying the regular expression, just specify the regex literal directly.
    • Though I've seen problems when the regex contains spaces, this works:
[[ "${output}" =~ "chart type".*"required" ]]
  • If the regular expression contains spaces, use single quotes to denote space:
if [["something" =~ ${regex}' ' ]]; then ...
  • Variable substitution works for both the string to be matched and the regular expression. When using a variable to specify the regular expression, do not enclose the variable in quotes, use it directly as in the example below:
if [[ "${var_containing_string_to_be_matched_against_regex}" =~ ${var_containing_regex} ]]; then ...
  • It matches [[:space:]]
  • If any part of the pattern is quoted, it is forcibly matched as a string.
  • The return value is 0 if the string matches the pattern, and 1 otherwise.
  • If the regular expression is syntactically incorrect, the conditional expression's return value is 2.
  • If the shell option nocasematch is enabled, the match is performed without regard to the case of alphabetic characters.
  • The =~ operator has the same precedence as == and !=.

Examples

A string that does not contain a slash:

if [[ ${something} =~ ^[^/]*$ ]]; then
   ...
fi

TODO

regex(3)