18

它似乎是一种比较运算符,但它在例如以下代码(取自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

4 回答 4

11

它是内置[[命令的仅 bash 补充,执行正则表达式匹配。由于它不必与完整字符串完全匹配,因此挥动该符号以表示“不精确”匹配。

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

更便携的版本:

if test `echo $LC_CTYPE | grep -c UTF` -ne 0 -a "$TERM" != "linux"
then
  ...
else
  ...
fi
于 2012-06-26T11:27:52.370 回答
7

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

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

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

(注意*此处不得引用)

于 2012-06-26T11:26:58.760 回答
3

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

于 2012-06-26T11:24:53.427 回答
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
于 2012-06-26T11:23:44.567 回答