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


14
string=123456

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

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

./test: line 3: [: =~: binary operator expected

Использование =~в этом случае неправильно. =~сравнивает скороговорку (левая сторона задания) с регулярным выражением 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

@Kusalananda: Что касается редактирования, кавычки не требуются в левой части выражения в двойных скобках [[ ... ]], поскольку там не происходит разбиение слов или расширение пути. Они нужны только при использовании одинарных скобок [ ... ](с обеих сторон) и справа от выражения с двойными скобками.
user000001

@ user000001 Пока вы правы, гораздо лучше просто заключить все переменные в рефлекс, если в этом нет необходимости. Это гораздо более безопасная привычка.
Джо

@Joe: Согласен, когда сомневаешься, цитируй ... Я упомянул об этом только потому, что это было исправлением к уже правильному ответу. Если бы это было с первой редакции, я бы не стал это комментировать.
user000001
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.