Что делает оператор "= ~" в сценариях оболочки?

Кажется, что это своего рода оператор сравнения, но что именно он делает в частности. следующий код (взятый из 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, похоже, не поддерживает этот оператор:

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

В этом конкретном случае я могу просто заменить весь блок на elipses_marker="…" (поскольку я знаю, что мой терминал поддерживает unicode), но что именно делает это =~?

Ответ 1

Это a bash - только дополнение к встроенной команде [[, выполняющее регулярное выражение. Поскольку это не обязательно точное совпадение полной строки, символ размахивается, указывая на неточное совпадение.

В этом случае, если $LC_CTYPE СОДЕРЖИТ строку "UTF".

Более портативная версия:

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

Ответ 2

Это регулярное выражение. Я предполагаю, что ваша версия bash пока не поддерживает.

В этом конкретном случае я бы предложил заменить его более простым (и более быстрым) сопоставлением шаблонов:

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

(обратите внимание, что * не следует указывать здесь)

Ответ 3

Подобно Ruby, он соответствует тому, где операнд RHS является регулярным выражением.

Ответ 4

Он соответствует регулярным выражениям

Обратитесь к следующему примеру из 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