将命令输出发送到数组时转义斜杠

将命令输出发送到数组时转义斜杠

在我当前的项目中,我尝试将输出获取git branch -r到 zsh 中的数组,如下所示:

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

但是,当我运行此命令时,我在终端上收到以下错误消息:

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

我推断 zsh 对分支名称中的正斜杠有问题。将 git 的输出发送到我的数组时,有没有办法可以处理正斜杠(以及其他特殊字符,如果我遇到其他字符)?

答案1

中的数组赋值语法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)

但在这里,你("${(@f)$(git branch -r)}")没有形成有效的全局模式,与斜线

为了完整性,

array = ( value1 value2 )

是 shell 中的有效语法rc(Research Unix V10 和 plan9 的 shell)。在该 shell 中,您不能这样做echo =,这会导致语法错误。您需要引用=.

相关内容