Изменение оператора bash = ~ на аргумент, совместимый с sh - PullRequest
0 голосов
/ 05 июня 2018

Так что я запускаю bash-скрипт в coreos, и поэтому у меня нет / bin / bash, однако у меня есть / bin / sh.Теперь с sh все было в порядке, пока я не использовал чей-то сценарий elses bash, и у них есть следующая строка:

 if [[ "$file" =~ ^https?:// ]]; then

и мой ОС пожаловался на sh: =~: unknown operand, теперь я предполагаю, что это означает, что оператор ~= несовместим с sh, но должен быть какой-то другой способ сделать эту форму, глядя на SO. Я обнаружил, что ~= - это оператор оператора регулярных выражений.У меня такой вопрос, тогда можно ли заменить ~= на что-нибудь?Примечание: у меня есть grep на моей машине.

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Вы можете вызвать expr, который выполняет базовое сопоставление с регулярным выражением:

if expr match "$file" 'https\?://'; then

Шаблон неявно привязан к началу строки.

0 голосов
/ 05 июня 2018

У меня grep на моей машине

Исходя из вышеприведенной строки, вы можете написать простое условное выражение, используя оператор if, как

if echo "$file" | grep -Eq "^https?://"; then
    printf 'regex matches\n'
fi

Регулярное совпадение в grep использует ERE (расширенные регулярные выражения), которое доступно в любом POSIX-совместимом grep, который вы установили.-q просто подавляет напечатанный нормальный стандартный вывод, но просто возвращает код завершения, чтобы узнать, было ли совпадение успешным.

Даже если у некоторого пакета grep у вас нет разрешенного -E, простоиспользовать базовую поддержку регулярных выражений, но лишить ? его специального значения и передать его буквально

if echo "$file" | grep -q "^https\?://"; then
0 голосов
/ 05 июня 2018

Вы можете переписать это как case команду:

case "$file" in
    http://* | https://* )
        # ...
        ;;
esac
...