グローバルマッチングテスト関数の作成

グローバルマッチングテスト関数の作成

私は高度なプログラミング言語で関数を書いていますが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/shAT&T kshベースのシステムで。

関連情報