关于bash:“=?”运算符在shell脚本中做了什么?

What does the “=~” operator do in shell scripts?

它似乎是一种比较运算符,但它在以下代码(摘自https://github.com/lvv/g it prompt/blob/master/git prompt.sh_l154)中究竟做了什么?

1
2
3
4
5
    if [[ $LC_CTYPE =~"UTF" && $TERM !="linux" ]];  then
            elipses_marker="…"
    else
            elipses_marker="..."
    fi

我目前正试图让git-prompt在mingw下工作,而mingw提供的外壳似乎不支持这个操作员:

1
2
3
conditional binary operator expected
syntax error near `=~'
`        if [[ $LC_CTYPE =~"UTF" && $TERM !="linux" ]];  then'

在这种特定的情况下,我可以用elipses_marker="…"替换整个块(我知道我的终端支持unicode),但是这个=~到底做了什么?


它只是对内置的[[命令的一个bash添加,执行regexp匹配。由于它不必与整个字符串完全匹配,因此符号会被挥动,以表示"不精确"的匹配。

在这种情况下,如果$LC_CTYPE包含字符串"utf"。

更便携的版本:

1
2
3
4
5
6
if test `echo $LC_CTYPE | grep -c UTF` -ne 0 -a"$TERM" !="linux"
then
  ...
else
  ...
fi


它是一个正则表达式匹配。我想你的bash版本还不支持这个。

在这种情况下,我建议用更简单(更快)的模式匹配替换它:

1
[[ $LC_CTYPE == *UTF* && $TERM !="linux" ]]

(注意,此处不能引用*)


和Ruby一样,它匹配rhs操作数是正则表达式的位置。


它与正则表达式匹配

请参阅http://tldp.org/ldp/abs/html/bashver3.html regexmatchref中的以下示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

input=$1


if [["$input" =~"[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" ]]
#                 ^ NOTE: Quoting not necessary, as of version 3.2 of Bash.
# NNN-NN-NNNN (where each N is a digit).
then
  echo"Social Security number."
  # Process SSN.
else
  echo"Not a Social Security number!"
  # Or, ask for corrected input.
fi