2017-10-11 63 views
0

我正在嘗試使用包含星號的變量進行正則表達式匹配。Bash:避免雙括號正則表達式測試中的文件名擴展

Bash中的以下命令集在操作符左側的變量中使用星號進行文件名擴展。

test='part1 * part2' 
[[ "$test" =~ ^(.+)\ .\ (.+)$ ]] && echo $BASH_REMATCH 

結果:part1 FILE1 FILE2 part2

但它不應導致:part1 * part2

我已經搜查,搜查,但無法弄清楚爲什麼發生這種情況。

回答

1

我意識到要求時,正則表達式匹配工作正常。擴展發生在雙括號內。當匹配後,擴展正在發生,當結果被回顯時。變量$BASH_REMATCH包含一個星號,並且需要雙引號。

正確的命令集是:

test='part1 * part2' 
regex='^(.+) . (.+)$' 
[[ "$test" =~ $regex ]] && echo "$BASH_REMATCH" 

UPDATE:設定正則表達式測試之外。

+0

非常正確。 (通常,除非給出明確的理由,否則你應該總是*引用擴展。) –

+1

在測試之外聲明正則表達式也是一種很好的做法,因爲它更容易閱讀(不需要轉義),b)適用於所有Bash版本(參見[這裏](http://mywiki.wooledge.org/BashGuide) /模式)在「正則表達式」下)。 –

+1

謝謝@BenjaminW。,我更新了答案。 – owenh000