との文字列パターンマッチング =〜の文字列パターンマッチングを理解するのに問題があります 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 " *より良くなる。しかし、これは単なる実験だったので、'学習体験以外は使用しません。