zsh 条件 OR 失败

Dmi*_*nov 1 zsh

# delete git branch
git--() {

  BRANCH=$1

  if [ -n $BRANCH]; then
    BRANCH=$(git rev-parse --abbrev-ref HEAD)
  fi

  if [ "$BRANCH" = 'master' || "$BRANCH" = 'develop' ]; then

    red "You should not delete $BRANCH"
    return 0
  fi
}
Run Code Online (Sandbox Code Playgroud)

失败了

git--:[:8: ']' expected
zsh: master: command not found...
git--:8: command not found: master
No branch specified therefore I'm using the current one: master
On branch master
nothing to commit, working tree clean
Do you really want to delete the branch master (y/n)?
Run Code Online (Sandbox Code Playgroud)

但是如果我改变

if [ "$BRANCH" = 'master' || "$BRANCH" = '开发']; 然后

if [ "$BRANCH" = 'master' ]; 然后

一切正常。如何进行 OR 比较?

谢谢!

Ada*_*hon 7

您有两个主要选择(当然也有一些不太直接的选择)

  1. 使用zsh语法并使用[[ ... ]]而不是[ ... ].

    if [[ "$BRANCH" = 'master' || "$BRANCH" = 'develop' ]]; then
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用-o而不是||为了保持 POSIX 兼容

    if [ "$BRANCH" = 'master' -o "$BRANCH" = 'develop' ]; then
    
    Run Code Online (Sandbox Code Playgroud)

如果代码只能使用 运行zsh,我建议使用 1。


错误消息的原因是这[只是一个常规命令,而不是zsh语法的一部分。[期望]作为最后一个参数,但||它是语法的一部分zsh并且具有优先级。它充当命令之间的分隔符,并将“条件”拆分为两个命令

[ "$BRANCH = 'master'
Run Code Online (Sandbox Code Playgroud)

"$BRANCH" = 'develop' ]
Run Code Online (Sandbox Code Playgroud)

如果第一个命令失败,则运行第二个命令。

]运行第一个命令失败,因为缺少结束语。这会导致错误消息:

git--:[:8: ']' expected
Run Code Online (Sandbox Code Playgroud)

第二个命令"$BRANCH"被值替换master。由于没有名为此命令的命令,master因此会返回错误消息

zsh: master: command not found...
Run Code Online (Sandbox Code Playgroud)