編寫全域匹配測試函式
在高級程式語言中,我正在編寫一個
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