嵌套 if/else 的 zsh 脚本解析器错误

zsh script parser error for nested if/else

我有以下简陋的 zsh 功能:

function remember()
{
  if [ "" != "" ]
  then
    if[ "" != "clean" ]
    then
      echo "Why";
      #echo  >> {~/.remember_info};
    else
      rm -r ~/.remember_info;
      touch ~/.remember_info;
    fi
  else
    cat .remember_info;
  fi
}

当我尝试获取它时,我得到:

`echo' 附近的解析错误(echo 是带有 echo "Why"; 的那一行)

这个错误是非描述性的,我认为它与循环逻辑的一部分有关(因为无论我给出什么指令,它都会出错)。

有什么办法可以"debug"这种事情吗? zsh -n 没有多大帮助(根本)

您在 [ 之后缺少一个空格。应该是:

function remember()
{
    if [ "" != "" ]
    then
    if [ "" != "clean" ]
    then
        echo "Why";
        #echo  >> {~/.remember_info};
    else
        rm -r ~/.remember_info;
        touch ~/.remember_info;
    fi
    else
    cat .remember_info;
    fi
}

[ 等同于 test。它是一个单独的命令,在 man test:

中有描述
TEST(1)                                                                                                                          

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION

clean 进行比较时,您忘记了 if[ 之间的 space。

不过,在这种情况下,您可以通过先处理 = 情况来简化您的函数。

function remember()
{
  if [ "" = "" ]; then
    cat ~/.remember_info
  elif [ "" = clean ]; then
    rm -r ~/.remember_info
    touch ~/.remember_info
  else
    echo "" >> ~/.remember_info;
  fi
}

或者,使用 case 语句。

remember () {
  f=~/.remember_info
  case  of
    "")
      cat "$f"
      ;;
    clean)
      rm -r "$f"
      touch "$f"
      ;;
    *)
      print "" >> "$f"
      ;;
  esac
}