原因:意外标记“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 脚本中的“fi”意外(预期“then”)