语法错误:bash 脚本中的“fi”意外(预期“then”)

Posted

技术标签:

【中文标题】语法错误:bash 脚本中的“fi”意外(预期“then”)【英文标题】:Syntax error: "fi" unexpected (expecting "then") in bash script 【发布时间】:2015-07-14 06:45:06 【问题描述】:

我尝试做脚本:

#!/bin/bash
IP='192.168.1.1'
fping -c1 -t300 $IP 2>/dev/null 1>/dev/null
if [ "$?" = 0 ]
then
    echo "Host found"
else
    echo "Host not found"
fi

然后我打开它:

pi@raspberrypi ~ $ sh /home/pi/sh/test.sh

/home/pi/sh/test.sh: 9: /home/pi/sh/test.sh: Syntax error: "fi" unexpected (expecting "then")

问题出在哪里?

【问题讨论】:

抱歉,我无法用 sh、bash 和 dash 重现这个问题。 正如所写的那样,shell 脚本在语法上是有效的。你确定那是你测试的 exact 脚本吗?从这里复制并粘贴到一个新文件中并运行它。有用吗? 交叉投递:askubuntu.com/questions/618260/script-sh-syntax-error 您的脚本可能有 DOS 行尾。保存你的脚本在dash 中给了我一个类似的语法错误(尽管它是一个意外的文件结尾而不是意外的“fi”)。你可能有混合的行尾;见***.com/q/3773649/1126841。 Bash syntax error: unexpected end of file的可能重复 【参考方案1】:

你可以试试

$ dos2unix /home/pi/sh/test.sh

然后再次运行。

【讨论】:

当你尝试在 cygwin 下从 github 构建一些 posix 项目时,最好在 cygwin 下从 git 克隆它【参考方案2】:

这很可能是因为在您的脚本中回车\r。尝试运行此命令来清理您的脚本。只跑一次。将备份原始文件。

perl -pi.bak -e 's/\r$//' /home/pi/sh/test.sh

【讨论】:

【参考方案3】:

如果您在 Windows 上使用 Notepad++ 编辑脚本文件,您可以从程序菜单中转换 EOL

Edit => EOL Conversion => Unix (LF)

【讨论】:

解决了我的问题。重新取出 git repo 时,我的行尾受到了影响,并且“语法错误:“fi”意外(期望“then”)”是自它起作用以来发生了什么变化的唯一线索。很难从消息中整理出来!【参考方案4】:
if xxx then
  commond
fi

语法错误:“fi”意外(应为“then”)

试试看:

if xxx 
then
  commond
fi

没关系。

【讨论】:

【参考方案5】:

可能是您从 ftp 服务器而不是通过 nano 或其他控制台文件编辑程序保存到文件。

尝试通过 nano 将代码粘贴到(空)文件中。

这为我解决了这个确切的问题。

【讨论】:

以上是关于语法错误:bash 脚本中的“fi”意外(预期“then”)的主要内容,如果未能解决你的问题,请参考以下文章

语法错误:“(”意外(预期“然后”)

Bash 脚本:意外标记附近的语法错误?

bash - 意外标记“<”附近的语法错误

解析错误:意外的令牌,预期的“,”和语法错误:意外的令牌'['[重复]

Laravel 5.4 路由中的双箭头错误(语法错误,意外的 '=>' (T_DOUBLE_ARROW))

Bash 脚本:给出错误:gzip:<文件>.conf.gz:文件意外结束