原因:意外标记“fi”附近的 Bash 语法错误

Posted

技术标签:

【中文标题】原因:意外标记“fi”附近的 Bash 语法错误【英文标题】:Why: Bash syntax error near unexpected token `fi' 【发布时间】:2015-03-27 13:34:22 【问题描述】:

所以我得到的错误是倒数第二个“fi”上意外标记“fi”附近的语法错误。一直在为此挠头。任何帮助是极大的赞赏!谢谢!

#!/bin/bash  

TFILE=/tmp/scripts/pdsh_demo.tmp  
if [ -f $TFILE ]; then  
   rm $TFILE  
fi  
/usr/bin/pdsh -R ssh -w host[0001-0200] 'command | grep -v "something"' >> $TFILE    

if [ ! -s $TFILE ]; then  
    exit  
fi  
if [ -f $TFILE ]; then  
    if grep -q "something" $TFILE ; then  
        grep -i "something" $TFILE | mailx -r "test.server" -s "Critical: something" -a $TFILE "test@test.com"  
    fi   
fi

【问题讨论】:

我无法重现该问题,并且代码看起来不错。我会在 $TFILE 各处加上引号,但这只有在文件名包含空格或元字符时才会有所不同,并且不应该导致当前值出现此错误。疯狂猜测:您使用的是 Cygwin,脚本是否有 Windows 行尾? 总是在 bash 中引用你的文件名。 (例如"$TFILE")否则,如果它包含空格,则空格后面的部分可以解释为单独的命令等。并且通常会在您的代码中导致此类错误。根据 Wintermute,其余部分看起来不错。 @DavidC.Rankin 在这种情况下虽然它没有,所以它没有区别。@OP 如果你从某个地方复制了任何代码,请确保任何地方都没有奇怪的字符。跨度> dos2unix myScript.sh?祝你好运。 如果你用记事本++写的,它可能到处都有回车。 【参考方案1】:

if grep -q "something" $TFILE ; then 

应该是

if [ $(grep -q "something" $TFILE) ]; then  

【讨论】:

不仅原始形式正确——grep 命令的退出代码决定了测试是否成功——你的重新表述根本不起作用:grep -q 设计不输出任何东西,所以你正在测试一个空字符串,它总是假的。如果没有-q,如果grep 的输出包含空格,则命令将中断。 是的,只是为了确定但没有用!不过谢谢! 我不关心安静的 -q 选项,对不起。

以上是关于原因:意外标记“fi”附近的 Bash 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

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

意外标记 `' ` 附近的语法错误

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

GDRIVE:意外标记“换行符”附近的语法错误

hadoop 3.1.2 ./start-all.sh 错误,意外标记 `<' 附近的语法错误

Bash 脚本中意外标记“if”附近的语法错误