bashrc中的意外令牌fi

时间:2016-10-17 14:37:10

标签: linux bash

当我遇到这个错误时,我正在编辑一些环境变量:

bash: /home/splacorn/.bashrc: line 115: syntax error near unexpected token `fi'
bash: /home/splacorn/.bashrc: line 115: `  fi'

这个if-statement-block导致了这个问题,但我没有看到任何意外的字符,而且它破坏了我的bashrc。我试过去除前面的空间,但它仍然无法正常工作。我该如何解决?感谢。

if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
  fi
    . /etc/bash_completion
fi

2 个答案:

答案 0 :(得分:0)

if声明中不能有空体;你至少需要伪命令:

if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    :
  fi
  . /etc/bash_completion
fi 

错误是说解析器看到令牌fi,它终止if语句,然后才能看到它在关键字then后面的命令。

答案 1 :(得分:0)

与您可能熟悉的其他编程语言不同,Shell不允许使用空块。在您的代码中,

if [ -f /usr/share/bash-completion/bash_completion ]; then
  . /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
   #HERE
fi

您必须至少输入一个我标记为#HERE的命令。

在这种情况下,在我看来,问题是fi和以下行已被交换,即代码是为了阅读

if [ -f /usr/share/bash-completion/bash_completion ]; then
  . /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi

在一般情况下,如果由于某种原因需要一个空块,那么传统的东西就是单:,这是编写no-op命令的最短和最有效的方法。贝壳。例如

if grep -q particular_setting /etc/daemon.conf; then
  :
else
  sed -i -e '$a\
particular_setting=true
' /etc/daemon.conf
fi

(在便携式shell脚本中,您无法使用if ! ...,因此 以这种方式编写do-unless-condition结构。这显然不是关注bash rc文件。)