比較變數時忽略某些字元?

比較變數時忽略某些字元?

例如,如果這是我的腳本:

if [[ $yesno == "What's going on" ]]; then

那麼我該如何使其忽略',例如??,.

所以基本上Whats going onWhat's going onWhat's going on?What's going on.看起來都是同一件事。我知道我可以|| [[ $yesno == ".. ]]匹配多個變量,但我無法輸入每個組合。

答案1

如果您只想讓特定範例起作用,您可以使用 bash 正規表示式匹配

[[ $yesno =~ What\'?s\ going\ on[.?]? ]]

我們用反斜線轉義引號和空格。

答案2

您可以在比較之前簡單地刪除變數中除了字母數字字元之外的所有字元:

$ yesno="What's going on?"
$ if [[ ${yesno//[^a-zA-Z0-9\ ]/} == "Whats going on" ]]; then echo "OK";fi
OK

答案3

最常見和最通用的方法之一是將字串通過管道傳輸到grep並檢查grep返回代碼。該if語句可以檢查任何指令或管道的退出代碼:

if echo "$yesno" | grep -q "What'*s *going *on[?.]*"; then

除了您提到的字元之外,這還允許單字之間有 0 個或多個空格。

此構造應該適用於 OS X、FreeBSD、GNU/Linux 以及提供 POSIX grep 的任何其他系統:

相關內容