2011-07-12 18 views
5

Aşağıdaki betik betikleri neden sadece variable worked çıktı? Basal düzenli ifade testlerinde dize değişmezleri neden kullanılamaz?

#! /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 

=~ operatörü sadece değişkenlere değil, hazır bilgi ile çalışır devletler bash belgelerinde şey var mı? Bu sınırlama diğer operatörler için geçerli midir?

+0

, koşuyorum 'GNU bash, versiyon 4.2.8 (1) -salınımı (x86_64-pc-linux-gnu)' Natty Narwhal tarih: operatörün. – splicer

cevap

7

Artık bash ifadeler için tırnak içine alınması gerekmez:

#! /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 

olsa bu değişti hangi sürümün hatırlayamıyorum.

1

Kodunuz aslında Bash 3.1'e kadar beklendiği gibi çalışır. Ancak Bash 3.2'den beri desen eşleştirme operatörünün davranışı değiştirildi. son Bash Manual alıntı:

“deseninin herhangi bir kısmı bir dize olarak eşleştirilecek zorlamak üzere iktibas edilebilir” Ve bu burada neler olduğunu tam olarak budur. {}'u meta karakter olarak kullanmanız gerekiyordu, ancak alıntı yaptığınız için Bash bunları tam anlamıyla yorumluyor. İki seçeneğiniz .: sahip

1.You böyle shopt -s compat31 ile 3.1 uyumluluk modunda açabilirsiniz

:

2.You Sağ taraftan alıntılar kaldırarak liman kodunuzu, can
#!/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 

bir aramayla ilgili durumda

#!/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