Błąd wyrażenia regularnego warunku

14
string=123456

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

Działa to dobrze, ale jeśli zmienię == na = ~ otrzymuję ten błąd:

./test: line 3: [: =~: binary operator expected
Lumify
źródło
Zastosowanie =~jest w tym przypadku nieprawidłowe. =~porównuje tupot (lewa strona zadania) z regularną ekspresją regexpo prawej stronie zadania. Wyrażenie regularne w najprostszej formie jest przekazywane jak'[0-9][0-9]'
Valentin Bajrami
9
@ val0x00ff, ale 123456jest poprawnym RE
roaima
@roaima zgodził się, jednak regex znany jest z silnika, odsyłaczy wstecznych, zestawu znaków, metaznaków oznaczających rozpoczęcie łańcucha, zakończenie łańcucha itp.
Valentin Bajrami

Odpowiedzi:

29

Bash „s regex dopasowywania działa tylko w podwójnych nawiasach kwadratowych[[ ... ]]:

string=123456
if [[ "$string" =~ 123456 ]]; then echo 123; fi
123
Roman Perekhrest
źródło
@Kusalananda: Jeśli chodzi o edycję, cudzysłowy nie są wymagane po lewej stronie wyrażenia podwójnego nawiasu [[ ... ]], ponieważ nie występuje tu dzielenie słów ani rozwijanie nazw ścieżek. Są one potrzebne tylko w przypadku używania pojedynczych nawiasów [ ... ](po obu stronach) i po prawej stronie wyrażenia podwójnego nawiasu.
user000001
@ user000001, gdy masz rację, o wiele lepiej jest po prostu cytować wszystkie zmienne odruchowo, chyba że nie ma takiej potrzeby. Jest to znacznie bezpieczniejszy nawyk.
Joe
@Joe: Zgadzam się, w razie wątpliwości, cytuję ... Wspomniałem tylko o tym, ponieważ była to edycja już poprawnej odpowiedzi. Gdyby był tam od pierwszej wersji, nie skomentowałbym tego.
user000001