[英]Why does BASH_REMATCH return empty when the script file is sourced from zsh?
所以我為自己創建了一個可愛的小 bash 腳本:
#!/usr/bin/env bash
TEXT="FOO BAR"
REGEX="FOO (.+)"
if [[ $TEXT =~ $REGEX ]]; then
echo "Matched ${BASH_REMATCH[1]}"
else
echo "No match."
fi
很基本。 如果我運行./cutescript.sh
,那么我會得到結果:
Matched BAR
但是如果我提供腳本, . ./cutescript.sh
. ./cutescript.sh
,那么它仍然匹配,但BASH_REMATCH[1
是空的。
笏。
我在 MacOS Catalina 10.15.7 (19H2) 上,在zsh
執行此操作,但使用bash
shebang。
任何人都可以解釋這種違規行為嗎?
當您使用.
,它由您正在運行的任何 shell 執行 - 在這種情況下,您說您在 zsh 中。 BASH_REMATCH
數組的名稱,顧名思義,特定於bash
; 例如,如果你的 shell 是 zsh,那么在這種情況下匹配的文本將在$match[1]
找到。 而且我認為 ksh 根本不進行真正的正則表達式匹配。
現在,知道BASH_REMATCH
在zsh
中不存在,我做了更多的挖掘:
這篇文章實際上是重復的。 這里還有另一個問題解釋了解決方案: BASH_REMATCH 不捕獲
設置選項KSH_ARRAYS
BASH_REMATCH
允許zsh
模擬bash
的正則表達式功能。
使上述腳本與zsh
兼容的一種簡單方法是:
#!/usr/bin/env bash
# Ensures that BASH_REMATCH works if called in zsh.
setopt KSH_ARRAYS BASH_REMATCH
TEXT="FOO BAR"
REGEX="FOO (.+)"
if [[ $TEXT =~ $REGEX ]]; then
echo "Matched ${BASH_REMATCH[1]}"
else
echo "No match."
fi
unsetopt KSH_ARRAYS BASH_REMATCH
還有另一個相關問題: $BASH_REMATCH[] 的 zsh 等價物是什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.