=〜

との文字列パターンマッチング =〜の文字列パターンマッチングを理解するのに問題があります bash のdivid = “10b62ab851″>

次の関数を記述しました(心配しないでください。これは単なる実験であり、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 

予想どおり。ただし、が1つだけで、最後の不一致文字がある場合は、どうなるかを確認してください。

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

これは私であり、これがどのように機能するかを理解していない(選択が壊れている)か、 bashのパターンマッチングに本当に1つずつエラーがありますか?

カウント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バージョン:

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は、攻撃に対してではなく、意図しないミスに対してのみ役立ちます。使用することはお勧めしません。

この質問は、より良い解決策や回避策を探すものではありません。 =〜

オペレーター、そのように動作する必要があるかどうか、動作する場合はその理由。

回答

=~ in([[ ]])は、正規表現パターンマッチ(つまり、検索、以下を参照)です。 )。これは、ファイル名ワイルドカードと同じパターンを使用する=(または==)とは異なります。

In特に、正規表現のアスタリスクは「前のユニットのゼロまたは1つのコピー」を意味するため、abc*abに0以上を加えたものを意味しますc s。

この場合、末尾のアスタリスクにより、関数の引数の最後の文字がオプションになります。最後の例では、パターンは、およびG*は空の文字列と一致するため、...68d3のような文字列と一致します。「任意の文字列」の正規表現「は.*、または「任意の文字、任意の回数」です。

正規表現一致は文字列内の任意の場所で一致を検索しますが、検索しないことに注意してください。 「全体の文字列である必要はありません。したがって、パターンcdeは文字列abcdefghに含まれます。

次のようなものを使用できます。

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

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

コメント

  • ああ、今は汚いです。パターンマッチングを使用するときは、ほとんどsedを使用します。もちろん、。*を使用して、それを知る必要があります。どういうわけか、今では明らかに間違った考えを学びました。シェル内のドットを忘れる-'はファイル名の一致の場合のみですよね?case / esacの場合、ドットも必要ですか?I '今はとてもばかげているようです!;)
  • @userunknown、caseはファイル名と同じパターンを使用します一致するため、*はすべてに一致し、ドットは単なるドットです。 =~は、シェル内で正規表現を使用する唯一の場所だと思います。 (もちろん、ksh / Zsh / Bashには、正規表現とほぼ同じ機能を持ちますが、構文が異なる拡張グロブがあります。ただし、Bashで明示的に有効にする必要があります。)
  • div id = “c9fbb5cabc”>

を使用して、ksh / zsh / bashへの依存関係を削除します(名前が-で始まるファイルの問題を回避します)。

  • わかりました、それはすばらしい言い訳です。したがって、シェルでのパターンマッチングが複雑であるという大まかな記憶は、少なくとも正しいものでした。今、私はずっと気分が良くなりました。 🙂 = $2.*を試しましたが、これも機能しますが、" $ 2 " *より良くなる。しかし、これは単なる実験だったので、'学習体験以外は使用しません。
  • 回答

    ここでは正規表現を使用せず、文字列の比較のみを行います:

    md5 () { sum=$(md5sum "$1" | awk "{print $1}") [[ $sum = "$2" ]] && echo fine || echo baarr; } 

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    Deep Theme Powered by WordPress