文字列パターンマッチング=~

文字列パターンマッチング=~

文字列パターンの一致を理解するのに問題があります。=~存在する強く打つ

私は次の関数を書きました(パニックにならないでください。これは単なる実験であり、md5sumの安全な方法ではありません)。

md5 ()  { 
     [[ "$(md5sum $1)" =~ $2* ]] && echo fine || echo baarr; 
}

いくつかの入力でテストしました。以下はいくつかの参考資料です。

md5sum wp.laenderliste
b1eb0d822e8d841249e3d68eeb3068d3  wp.laenderliste

制御合計のソースにファイル名の 2 つのスペースが含まれていない場合、比較は不必要に困難になります。これが観察の出発点ですが、この問題を解決するための多くのアプローチよりも興味深いのは私の観察です。

制御変数を定義し、短すぎるが一致する文字列を使用して関数をテストしました。

ok=b1eb0d822e8d841249e3d68eeb3068d3
for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i} ;done 
fine
fine
fine
fine

これは、「wp.laenderliste」の欠落の不一致を無視して、より長い不一致を無視することが関数の目的であるため、予想されます。

これで、一致しないランダムなアイテムを追加すると、当然エラーが発生し、それが得られます。

for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i}GU ;done 
baarr
baarr
baarr
baarr

予想通り。しかし、あるとき一致しない最後の文字のみ、見てみましょう:

for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i}G ;done 
fine
fine
fine
fine

これがどのように機能するか(selectが壊れている)気付いていないのは私ですか、それともbashのパターンマッチングに実際にバグがありますか?

文字列の中央の不一致は、数1に関連付けられます。

for i in 5 9 e ; do echo md5 wp.laenderliste ${ok//$i/_} ;done 
md5 wp.laenderliste b1eb0d822e8d841249e3d68eeb3068d3
md5 wp.laenderliste b1eb0d822e8d84124_e3d68eeb3068d3
md5 wp.laenderliste b1_b0d822_8d841249_3d68__b3068d3

for i in 5 9 e ; do md5 wp.laenderliste ${ok//$i/_} ;done 
fine
baarr
baarr

バッシュバージョン:

bash -version
GNU bash, Version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder jünger <http://gnu.org/licenses/gpl.html>

婦人声明:md5sum は、攻撃ではなく、意図しないエラーを防ぐためにのみ役立ちます。私はその使用をお勧めしません。

この質問は、より良い解決策や解決策を見つけることではありません。これはおおよそ=~オペレーター、正常に動作する必要があるかどうか、その場合はなぜですか?

ベストアンサー1

=~()内は[[ ]]正規表現パターンの一致(またはむしろ、探す、下記参照)。これは、ファイル名ワイルドカードと同じパターンを使用する=(or)とは異なります。==

具体的には、正規表現のアスタリスクは、「前の単位のコピー0個または1個」を意味するため、プラス0個以上のsをabc*意味します。abc

あなたの場合、末尾のアスタリスクは関数パラメータの最後の文字をオプションにします。最後の例では、パターンは...68d3G*G*空の文字列と一致するため、類似した文字列と一致します...68d3。 「すべての文字列」の正規表現は.*「すべての文字、すべての回数」です。

正規表現の一致は、文字列のどこからでも一致するものを検索するため、必ずしも一致する必要はありません。みんなひも。したがって、cdeパターンは文字列にありますabcdefgh

次のようなものを使用したい場合があります。

[[ "$(md5sum -- "$1")" = "$2 "* ]] && echo ok

または

[ "$(md5sum < "$1")" = "$2  -" ] && echo ok

ここでは実際に正規表現の一致は必要なく、md5sumとにかく末尾のスペース(およびファイル名)が出力されるため、パターンでそれを使用してパターン全体と一致することを確認できます。したがって、切り捨てられたハッシュを使用して関数を提供すると、一致しません。

おすすめ記事