"=〜"运算符在shell脚本中做了什么?

pen*_*tur 15 bash shell

它似乎是一种比较运算符,但它究竟是什么在例如下面的代码中(取自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
Run Code Online (Sandbox Code Playgroud)

我目前正试图git-prompt在MinGW下工作,而MinGW提供的shell似乎不支持这个运算符:

conditional binary operator expected
syntax error near `=~'
`        if [[ $LC_CTYPE =~ "UTF" && $TERM != "linux" ]];  then'
Run Code Online (Sandbox Code Playgroud)

在这个特定的情况下,我可以用elipses_marker="…"(因为我知道我的终端支持unicode)替换整个块,但究竟是什么=~呢?

Mat*_*nco 10

它是内置[[命令的仅限bash ,执行正则表达式匹配.由于它不必是完整字符串的精确匹配,因此符号被挥动,以指示"不精确"匹配.

在这种情况下,如果$LC_CTYPE CONTAINS字符串"UTF".

更便携版:

if test `echo $LC_CTYPE | grep -c UTF` -ne 0 -a "$TERM" != "linux"
then
  ...
else
  ...
fi
Run Code Online (Sandbox Code Playgroud)

  • 没有必要在反引号中运行grep.`if echo $ LC_TYPE | grep -Fq UTF && test"$ TERM"!= linux; then` (2认同)

Mic*_*rny 6

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

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

[[ $LC_CTYPE == *UTF* && $TERM != "linux" ]]
Run Code Online (Sandbox Code Playgroud)

(注意*这里不得引用)