私は高度なプログラミング言語で関数を書いていますがwildcardMatch(input, pattern)
、それがUnixのglobマッチとまったく同じように機能したいと思います。
そのために、私はプロパティベースのテストを使用してランダムな入力を生成し、それを実装とUnixの実装でテストし、戻り値が等しいかどうかを比較しました。
私の問題は、単純なUnixヘルパースクリプトを信頼していないことです。
#!/bin/bash
## Created for development/testing
##
## Example Usage:
## ./wildcard_test.sh "foobar" "fooba*"
string=$1
pattern=$2
if [[ $string == $pattern ]]; then
echo 0
exit 0
else
echo 1
exit 1
fi
スクリプトが実際に実行される前に拡張が行われることがわかるまで、すべてがうまくいきました。
./wildcart_test.sh "foo" "???"
この例では、疑問符が拡張され、ディレクトリ内の他のファイルと実際に一致するため、==
比較が失敗します。lib
たとえば、この場合は。
グローバルマッチングをテストするより良い方法はありますか?
答え1
いいえ、
./wildcart_test.sh "foo" "???"
引用したように???
問題がないため、シェルによって拡張されません。ただし、二重引用符の中の、\
および文字は$
まだ特別です。`
Bourneなどのシェルでは、特殊文字なしで一重引用符を使用できます。
ただし、ここでできることの1つは、依存関係を排除し、これを実行するためにbash
標準構文を使用することです。sh
#! /bin/sh -
subject=${1?No subject} pattern=${2?No pattern}
case $subject in
($pattern) echo 1; true;;
(*) echo 0; false;;
esac
参考にしてください。0
終了ステータスtrueを表し、0を使用する方が一般的です。数字偽で、ゼロでないのは真です。
ただし、sh
移植性のためにはまだ標準ではないため、[^x]
で作成する必要があります。[!x]
[^x]
\
パターンマッチングコードでinが特別に処理されるかどうかは、$pattern
実装とバージョンによって異なります。that-script '\foo' '\*'
場合によっては false を返し、他の場合は true を返すことができます。についても同様ですthat-script '*' '\*'
。
リテラルバックスラッシュを一致させるには、を使用しますthat-script '\foo' '[\\]*'
。ワイルドカード(?
、、、*
)[
を一致させるにはthat-script '*?[' '[*][?][[]'
。また、Bourneシェルとそのサブアイテム(ksh88、ksh93)のバグ/バギー機能にも注意してください。両方が返されthat-script a '[a]'
ます。that-script '[a]' '[a]'
本物/bin/sh
AT&T kshベースのシステムで。