意外标记'fi'附近的语法错误|格式显示正确

时间:2014-05-03 19:01:27

标签: bash if-statement terminal centos syntax-error

我试图从终端执行此脚本(通过sh PreStartupCommands.sh),我的终端窗口出现以下错误:

/home/MinecraftServers/Ephona/serverconfig/PreStartupCommands.sh: line 14: syntax error near unexpected token `fi'
/home/MinecraftServers/Ephona/serverconfig/PreStartupCommands.sh: line 14: `fi'

PreStartupCommands.sh

#!/bin/bash
############################################
########### PreStartupCommands #############
############################################
#
### Update Ephona_sky ###
if [ -f '/home/MinecraftServers/Ephona/Ephona_sky_edit/lock.txt' ] ; then
    echo "Lock exists"
else
    echo "Lock Does Not Exist"
    echo "Copying World ..."
    echo "World Copied"
    echo "Creating Lock"
fi

对我来说一切都很好。

  • [和]周围的间距
  • ifthenelsefi标记都包含在内
  • 所有报价均已打开和关闭
  • 拼写正确......

1 个答案:

答案 0 :(得分:3)

更新:问题原因是脚本文件具有Windows样式的行结尾(\r\n)而不是bash - 以及一般的Unix实用程序 - 期待(仅\n),因为@devnull怀疑。


通常情况下,sh在CentOS上符号链接到bash,因此您的脚本应该可以正常工作。

(顺便说一下:任何符合POSIX标准的shell都应该与您问题中的特定示例脚本一起使用 一般警告:正如@Scrutinizer在评论中指出的那样,调用bash作为sh意味着行为的细微变化 - 请参阅http://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html(*) - 尽管bashisms仍然有用。)

但是,一般情况下,如果您正在调用bash脚本,那么使用bash调用它时概念上更清晰,更安全 - 假设sh可以已被重新定义以调用不同的shell。

当然,您可以运行chmod +x PreStartupCommands.sh使您的脚本自行执行,这会使问题消失(假设问题与处理脚本的可执行文件有关)。

(*)在 OSX 上调用bash作为sh其他含义(因为sh是单独的编译可执行文件而不是那里的符号链接),即默认情况下打开shell选项xpg_echo,并且在没有$FCEDIT时使用ed (不检查$EDITORbash通常会这样做。