在Shell脚本中,"=~"运算符的作用是什么?

20

看起来这是一种比较运算符,但在例如以下代码中(来自https://github.com/lvv/git-prompt/blob/master/git-prompt.sh#L154),它到底是做什么的?

    if [[ $LC_CTYPE =~ "UTF" && $TERM != "linux" ]];  then
            elipses_marker="…"
    else
            elipses_marker="..."
    fi
我正在尝试让git-prompt在MinGW下工作,但是MinGW提供的Shell似乎不支持这个运算符:
conditional binary operator expected
syntax error near `=~'
`        if [[ $LC_CTYPE =~ "UTF" && $TERM != "linux" ]];  then'
在这种情况下,我可以用 elipses_marker="…" 全部替换该块(因为我知道我的终端支持Unicode),但是=~到底是什么意思?
4个回答

13

这是一种仅适用于Bash的[[命令的补充,执行正则表达式匹配。由于它不必精确匹配整个字符串,所以该符号被使用来表示“近似”匹配。

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

更便携的版本:

if test `echo $LC_CTYPE | grep -c UTF` -ne 0 -a "$TERM" != "linux"
then
  ...
else
  ...
fi

3
不需要在反引号中运行grep。如果LC_TYPE变量包含UTF字符串且TERM变量不等于linux,则执行以下操作:if echo $LC_TYPE | grep -Fq UTF && test "$TERM" != linux; then - William Pursell
1
试图鼓励可读性的代码...我发现只有一个test和反引号包围第一个“表达式”更直观,使其看起来像一个表达式。(而grep -q在出错时也会为真):-)但我同意。我有一个使用test的习惯,但我认为它比在管道中使用if:ing更易读。 - MattBianco
“grep -q 在出现错误时也会返回 true” 这句话是什么意思? - William Pursell
1
有趣。参考链接:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html。“如果指定了-q选项,则即使检测到错误,如果选择了输入行,则退出状态应为零。否则,将执行默认操作。” - William Pursell
这不是[ ]的Bash扩展,它只存在于[[ ]]中,而不是Bash对[ ]的实现。 - Charles Duffy
显示剩余2条评论

7

这是一个正则表达式匹配。我猜测您的bash版本还不支持。

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

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

(请注意在此处不要引用*
(注:此处的*不能被引用)

3

就像 Ruby 一样,它可以与右手操作数为正则表达式的情况匹配。


2

它可以匹配正则表达式。

请参考来自http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF的以下示例:

#!/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

2
如果您在Bash 3.2中引用正则表达式,则它将变成一个字面字符串而不是正则表达式。 - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接