Как регулярное выражение сравнить строку в тире?

По соображениям совместимости я перемещаю bash-скрипт в dash. Есть ли альтернатива POSIX / Dash следующему сравнению?

COMPARE_TO="^(lp:~?|https?://|svn://|svn\+ssh://|bzr://|bzr\+ssh://|git://|ssh://)"

if [[ $COMPARE =~ $COMPARE_TO ]]; then
    echo "WE ARE COMPARED!"
fi

person Marco Ceppi    schedule 28.08.2012    source источник


Ответы (2)


Можно использовать чехол. Он не использует регулярное выражение, но не намного дольше с глобусами

case $compare in
    lp:*|http://*|https://*|svn://*|svn+ssh://*|bzr://*|bzr+ssh://*|git:/*|ssh://*)
        echo "We are compared"
    ;;
esac

Кстати, вам следует избегать использования всех имен переменных в верхнем регистре, поскольку вы рискуете перезаписать специальные переменные оболочки или переменные среды.

person geirha    schedule 28.08.2012

dash не имеет встроенного сравнения регулярных выражений, но вы всегда можете использовать grep:

if echo "$compare" | egrep -q "$compare_to"; then
    ...

(Обратите внимание, что я второй замечание @ geirha о переменных в верхнем регистре в оболочке.)

person Gordon Davisson    schedule 28.08.2012
comment
echo в таком контексте всегда немного пугает. case ответ более идиоматичен и элегантен и решает проблему полностью без внешних процессов. - person tripleee; 28.08.2012
comment
@tripleee: я считаю синтаксис оператора case очень неэлегантным, но я согласен, что он более идиоматичен и сохраняет подпроцессы (при условии, что вы можете выразить свой шаблон как глобус, а не регулярное выражение, и вы можете в этом конкретном случае). Кстати, если вас беспокоит эхо, используйте вместо этого printf "%s\n" "$compare". - person Gordon Davisson; 29.08.2012