Wildcards

編寫全域匹配測試函式

  • December 9, 2019

在高級程式語言中,我正在編寫一個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


有沒有更好的方法來測試全域匹配?

不,

./wildcart_test.sh "foo" "???"

很好,因為???引用了,所以不會被你的 shell 擴展。但是請注意,\,$和```字元在雙引號中仍然​​是特殊的。您可能想要使用單引號,其中沒有特殊字元(在 Bourne-like shell 中)。

不過,您可以在這裡做的一件事是刪除bash依賴項並使用標準sh語法進行操作:

#! /bin/sh -
subject=${1?No subject} pattern=${2?No pattern}
case $subject in
 ($pattern) echo 1; true;;
 (*)        echo 0; false;;
esac

請注意,雖然0 退出狀態表示為真,但更習慣使用 0數字表示假,非零數字表示真。

但是請注意, with sh,要便於移植,[^x]需要編寫[!x][^x]仍然不是標準的。

而模式匹配程式碼是否\對 in$pattern進行特殊處理也取決於實現和版本。that-script '\foo' '\*'可能對某些返回 false,對其他返回 true。對that-script '*' '\*'.

要匹配文字反斜杠,請使用that-script '\foo' '[\\]*'. 要匹配萬用字元 ( ?, *, [),請使用that-script '*?[' '[*][?][[]'. 還要注意 Bourne shell 及其後代(ksh88、ksh93)中的錯誤/錯誤功能:在基於 AT&T ksh 的系統上,that-script a '[a]'兩者that-script '[a]' '[a]'都會返回true 。/bin/sh

引用自:https://unix.stackexchange.com/questions/556368