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

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

Ответы на вопрос(4)

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

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

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

(Обратите внимание, что* здесь не должно цитироваться)

Решение Вопроса

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

В этом случае, если$LC_CTYPE CONTAINS строка "UTF".

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

if test `echo $LC_CTYPE | grep -c UTF` -ne 0 -a "$TERM" != "linux"
then
  ...
else
  ...
fi
 26 июн. 2012 г., 16:25
Что вы подразумеваете под "grep -q, будет верно и для ошибки"?
 26 июн. 2012 г., 16:08
Нет необходимости запускать grep в кавычках.if echo $LC_TYPE | grep -Fq UTF && test "$TERM" != linux; then
 26 июн. 2012 г., 16:24
Пытаясь поощрить читабельный код ... я нахожу его более интуитивно понятным только с однимtest и галочки, окружающие первое «выражение», что делает его похожим на выражение. (И grep -q также будет верен при ошибке) :-) Но я согласен. У меня есть привычка использоватьtest слишком часто, но я думаю, что это более читабельно, чемif:ing труба.
 26 июн. 2012 г., 16:34
Мне кажется, что grep в случае ошибки на самом деле является желаемым поведением.
 26 июн. 2012 г., 16:32
Интересно. Для справки:pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html  & quot; Если указана опция -q, статус выхода должен быть нулевым, если выбрана входная строка, даже если обнаружена ошибка. В противном случае должны быть выполнены действия по умолчанию. & Quot;

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

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

Обратитесь к следующему примеру из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
 26 июн. 2012 г., 16:39
Если вы цитируете регулярное выражение (начиная с Bash 3.2), оно становится литеральной строкой вместо регулярного выражения.

Ваш ответ на вопрос