Ошибка регулярного выражения условия

14
string=123456

if [ $string == 123456 ]; then
echo 123
fi

Это работает нормально, но если я изменяю == на = ~, я получаю эту ошибку:

./test: line 3: [: =~: binary operator expected
Lumify
источник
Использование =~в этом случае неправильно. =~сравнивает скороговорку (левая сторона задания) с регулярным выражением regexна правой стороне задания. Регулярное выражение в его простейшей форме передается как'[0-9][0-9]'
Валентин Байрами
9
@ val0x00ff, но 123456является действительным RE
roaima
@roaima согласилась, однако regex известен своим движком, обратными ссылками, набором символов, метасимволами, обозначающими начало строки, конец строки и т. д.
Valentin

Ответы:

28

Bash «S регулярное выражение соответствие работает только в двойных квадратных скобках[[ ... ]]:

string=123456
if [[ "$string" =~ 123456 ]]; then echo 123; fi
123
RomanPerekhrest
источник
@Kusalananda: Что касается редактирования, кавычки не требуются в левой части выражения в двойных скобках [[ ... ]], поскольку там не происходит разбиение слов или расширение пути. Они нужны только при использовании одинарных скобок [ ... ](с обеих сторон) и справа от выражения с двойными скобками.
user000001
@ user000001 Пока вы правы, гораздо лучше просто заключить все переменные в рефлекс, если в этом нет необходимости. Это гораздо более безопасная привычка.
Джо
@Joe: Согласен, когда сомневаешься, цитируй ... Я упомянул об этом только потому, что это было исправлением к уже правильному ответу. Если бы это было с первой редакции, я бы не стал это комментировать.
user000001