簡體   English   中英

當腳本文件來自 zsh 時,為什么 BASH_REMATCH 返回空?

[英]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_REMATCHzsh中不存在,我做了更多的挖掘:

這篇文章實際上是重復的。 這里還有另一個問題解釋了解決方案: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM