Linux

將命令輸出發送到數組時轉義斜杠

  • August 12, 2021

在我目前的項目中,我試圖將輸出從git branch -rzsh 中的一個數組中取出,如下所示:

% all_branches = ("${(@f)$(git branch -r)}")

但是,當我執行此命令時,我在終端上收到以下錯誤消息:

zsh: bad pattern: (  origin/Backplane-Broken-Links

我推斷 zsh 對分支名稱中的正斜杠存在問題。在將 git 的輸出發送到我的數組時,有沒有辦法可以處理正斜杠(以及其他特殊字元,如果我遇到任何其他字元)?

中的數組賦值語法zsh(就像從bash中藉來的語法一樣zsh)是:

array=( value1 value2
value3...)

兩邊都不能有空格=(儘管裡面可以有(空格、製表符或換行符),(...)它們像往常一樣用於分隔單詞,以及構成數組成員的那些單詞)。

所以你要:

all_branches=("${(@f)$(git branch -r)}")

或者:

all_branches=( "${(@f)$(git branch -r)}" )

或者:

all_branches=(
 "${(@f)$(git branch -r)}"
)

無論您喜歡哪種風格。

all_branches=(${(f)"$(git branch -r)"})

也會工作。當您想要保留空元素時,將整個擴展"..."與標誌結合起來。@我不認為 git 分支名稱可以為空,並且請注意,無論如何$(...)都會刪除所有尾隨換行符,因此如果它們位於輸出的末尾,則無論如何都會刪除空分支。我們仍然需要$(...)被引用以防止$IFS分裂。

順便說一句,array = ()這將是array=函式定義的開始:

$ array = ()
function> echo test
$ array
test
$ =
test

儘管:

array = (foo|bar)

將使用與glob 模式(如果有)匹配的文件作為參數執行array命令(如果找到) 。=``(foo|bar)

但是在這裡,您沒有形成有效的 glob 模式,與slashes("${(@f)$(git branch -r)}")無關。

為了完整性,

array = ( value1 value2 )

rcshell 中的有效語法(Research Unix V10 和 plan9 的 shell)。在那個 shell 中,你不能這樣做echo =會給你一個語法錯誤。您需要引用=.

引用自:https://unix.stackexchange.com/questions/664324