Shell .sh意外的“fi”(预期的“then”)

Shell .sh意外的“fi”(预期的“then”),shell,sh,Shell,Sh,我在运行.sh脚本时遇到一些问题。我收到以下错误消息: power_toggle.sh: line 8: syntax error: unexpected "fi" (expecting "then") 剧本: #!/bin/sh SERVICE='hyperiond' if pgrep $SERVICE > /dev/null then killall hyperiond 2>/dev/null else /storage/.config/autostart.sh

我在运行.sh脚本时遇到一些问题。我收到以下错误消息:

power_toggle.sh: line 8: syntax error: unexpected "fi" (expecting "then")
剧本:

#!/bin/sh
SERVICE='hyperiond'
if pgrep $SERVICE > /dev/null
then
    killall hyperiond 2>/dev/null
else
    /storage/.config/autostart.sh > /dev/null 2>&1 &
fi
我试过shellcheck.net,它没有发现任何问题。。 我还使用了chmod+x'ed,这两个命令可以通过ssh终端运行


希望你们能帮我,因为我迷路了。

只将您的行尾从Windows转换为Unix LF。

只将您的行尾从Windows转换为Unix LF。

看不出有什么错误,它对我很好……您确定上面的脚本是您实际上要执行的吗?显示的语法是正确的。这强烈建议不要这样做任何生成错误的脚本都不是您显示的脚本。代码中有一些改进的空间-名义上,在pgrep$SERVICE中的变量周围使用双引号是一个好主意,使用killall$SERVICE绝对是一个好主意,这样您就可以在不终止错误进程的情况下更改服务-但从语法上讲,它是很好。我不知道它是什么,我有100次trid,检查了很多次。如果我尝试sh power_toggle.sh,它会给我上面的错误。如果我尝试/power_toggle.sh,它会给我sh:./power_toggle.sh:找不到。。我正在使用windows并上传到openelec@Raspberry Pi.BTW,如果你的脚本以!/bin/sh开头,它是POSIX sh脚本,而不是bash脚本。即使您的/bin/sh是bash的符号链接,当被调用时,它也会在POSIX兼容模式下运行。在许多现代操作系统中,/bin/sh是一个完全不同的解释器,如ash或dash。因此,我删除了bash标记。@user1934428,…顺便说一句,检查两个shell实现了哪一个在Bourne中很简单,^是管道字符,因此在POSIX sh外壳上,echo ^echo将在其输出上发出^echo,而在Bourne外壳上,它将只发出一个空行。[这就是为什么需要区分POSIX sh和Bourne的原因:这两种语言互不兼容]。请不要看到任何错误,这对我来说很好…您确定上面的脚本就是您实际尝试执行的脚本吗?显示的语法是正确的。这强烈表明生成错误的脚本不是您显示的脚本。代码中有一些改进空间-名义上,使用双引号是一个好主意关于pgrep$SERVICE中的变量,使用killall$SERVICE绝对是一个好主意,这样您就可以在不终止错误进程的情况下更改服务-但从语法上讲,这很好。我不知道它是什么,我已经trid了100次,检查了很多次。如果我尝试sh power\u toggle.sh,它会给出上述错误。如果我尝试。/power\u toggle.sh it gives me sh:./power_toggle.sh:未找到..我正在使用windows并上传到openelec@Raspberry Pi.BTW,如果您的脚本以!/bin/sh开头,它是一个POSIX sh脚本,而不是bash脚本。即使您的/bin/sh是bash的符号链接,在许多现代操作系统中,/bin/sh是完全不同的租用诸如ash或dash之类的解释器。因此,我删除了bash标记。@user1934428,…顺便说一句,检查shell实现的两个字符中的哪一个是管道字符很容易,因此在POSIX sh shell上,echo ^echo将在其输出上发出^echo,而在Bourne shell上,它只发出一个空行。[这就是为什么有必要区分POSIX sh和伯恩:这两种语言互不兼容]。除非它们有混合的行结尾,否则脚本应该会因为无法找到/bin/sh\r.@Mr.Llama而引发警告或错误,前提是它是exec'd而不是从shell调用的,当exec syscall失败时,shell通常会返回到使用sh或自身作为解释器执行。bash不处理shebang;系统调用does、 第一个字符是一个精确的字符,因此shell完全忽略该行。除非它们有混合的行尾,否则脚本应该抛出一个警告或错误,因为无法找到/bin/sh\r.@Mr.Llama,前提是它是exec'd而不是从shell调用的,而shell通常会返回到使用sh或自身作为interpre执行ter当exec syscall失败时。bash不处理shebang;系统调用处理。第一个字符是一个精确的字符,以便shell完全忽略该行。