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

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

@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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.