2011-07-12 9 views
5

Dlaczego poniższy skrypt bash wyświetla tylko variable worked?Dlaczego w testach basha nie można używać ciągów literowych?

#! /bin/bash 

foo=baaz 
regex='ba{2}z' 

if [[ $foo =~ 'ba{2}z' ]]; then 
    echo "literal worked" 
fi 

if [[ $foo =~ $regex ]]; then 
    echo "variable worked" 
fi 

Czy jest coś w dokumentacji bash, który stwierdza, operator =~ działa tylko ze zmiennych, a nie literałów? Czy to ograniczenie ma zastosowanie do innych operatorów?

+0

W przypadku jest to istotne, biegnę 'GNU bash, wersja 4.2.8 (1) -release (x86_64-pc-linux-gnu)' na Natty Narwal. – splicer

Odpowiedz

7

Nie trzeba ofert dla bash regex już:

#! /bin/bash 

foo=baaz 
regex='ba{2}z' 

if [[ $foo =~ ba{2}z ]]; then 
    echo "literal worked" 
fi 

if [[ $foo =~ $regex ]]; then 
    echo "variable worked" 
fi 

# Should output literal worked, then variable worked 

Nie pamiętam, która wersja zmieniło to jednak.

1

Twój kod działa zgodnie z oczekiwaniami aż do wersji 3.1 Bash. Jednak od wersji Bash 3.2 zachowanie operatora dopasowywania wzorca zostało zmienione. Cytat z najnowszego Bash Manual:

„Każda część wzoru mogą być cytowane, aby zmusić go do być dopasowana jako łańcucha.”

I to jest dokładnie to, co się tutaj dzieje. Zamierzałeś użyć {} jako meta znaków, ale skoro to cytujesz, Bash interpretuje je dosłownie. Masz dwie opcje .:

1.You można włączyć tryb zgodności z 3,1 shopt -s compat31 tak:

#!/bin/bash 
shopt -s compat31 

foo=baaz 
regex='ba{2}z' 

if [[ $foo =~ 'ba{2}z' ]]; then 
    echo "literal worked" 
fi 

if [[ $foo =~ $regex ]]; then 
    echo "variable worked" 
fi 

2.You można portu swój kod, usuwając cytaty z prawej strony operatora:

#!/bin/bash 

foo=baaz 
regex='ba{2}z' 

if [[ $foo =~ ba{2}z ]]; then 
    echo "literal worked" 
fi 

if [[ $foo =~ $regex ]]; then 
    echo "variable worked" 
fi 
Powiązane problemy