2011-07-12 2 views
5

なぜ次のbashスクリプトはvariable workedだけを出力しますか?bash正規表現テストで文字列リテラルを使用できないのはなぜですか?

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

=~オペレータは変数だけではなく、リテラルで動作述べbashのマニュアルの何かがありますか?この制限は他の事業者にも適用されますか?

+0

、私が実行している 'GNUのbashのは、バージョン4.2.8(1)-release(x86_64版-pc-linux-gnuのよう)'ナッティイッカク上:オペレーターの。 – splicer

答えて

7

あなたはもう、bashの正規表現のための引用符は必要ありません。

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

私もこれを変更したバージョンを覚えていないことができます。

1

あなたのコードは、実際には期待通りBash 3.1まで動作します。 しかし、Bash 3.2以降、パターンマッチ演算子の動作が変更されました。

「パターンのいずれかの部分が 文字列として一致させることを強制するために引用される」

そしてそれは、ここで起こっている正確に何である:最新Bash Manualからの引用。 {}をメタ文字として使用することを意図していましたが、引用したので、Bashはそれらを文字通り解釈します。 次の2つのオプション:

1.Youは、このようなshopt -s compat31で3.1互換モードをオンにすることができます:右側からの引用を除去することで、

#!/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 CANポート、あなたのコードをそれは、関連だ場合

#!/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 
関連する問題