Linux
將命令輸出發送到數組時轉義斜杠
在我目前的項目中,我試圖將輸出從
git branch -r
zsh 中的一個數組中取出,如下所示:% 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 )
是
rc
shell 中的有效語法(Research Unix V10 和 plan9 的 shell)。在那個 shell 中,你不能這樣做echo =
會給你一個語法錯誤。您需要引用=
.