预期的“fi”是意外的吗?

预期的“fi”是意外的吗?

我正在尝试检查文件大小是否小于 9999 字节,但我不知道为什么它会在这里中断。

if compgen -G "$jdir0/"*.srt 
then

for f in "$jdir0"/*.srt
do
    jsubtitle="$(basename $f)"
    filesize=$(du -b "$jdir0/$jsubtitle" | cut -f1)
        if [ "$filesize" -lt 9999 ] then
           echo "less"
        fi   #line 443
        if [ $filesize -gt 10000 ] then......etc,etc...



    **line 443: syntax error near unexpected token `fi'**

我已经检查了变量 $filesize,它只包含数字,没有空格,我也尝试过在 if 语句中变量 $filesize (和 9999)周围没有“”。我也测试过双 [[,但没有..

这个 is 语句位于“for f in..”循环内的另一个 if 语句内,但这不应该影响这个吗?

答案1

我认为你的问题是你then与条件处于同一行。它要么需要位于下一行,要么前面有一个分号。

解决方案: if [ "$filesize" -lt 9999 ]; then

答案2

if 中的then需要占据自己的行或前面带有;:

    if [ "$filesize" -lt 9999 ]; then
       echo "less"
    fi

答案3

在:

if [ "$filesize" -lt 9999 ] then
           echo "less"
fi

then作为命令的额外参数传递[,而不是作为then结束列表的关键字条件命令在里面:

if
   condition-commands
then
   then-commands
〚elif
   more-condition-commands
then
   more-then-commands〛
〚else
   else-commands〛
fi

陈述。

如果您将该[命令替换为另一个具有不太不寻常名称的简单命令,则它会变得更加明显,例如echo

if echo whatever then
  echo "less"
fi

不要被 stackexchange 的语法突出显示所迷惑,该语法突出显示then在那里标识为关键字,即使 shell 在简单命令(如echoor )的参数中不将其视为关键字[。您会注意到它在以下情况中执行相同的操作:

echo then
[ then = alors ]

fi是出乎意料的,因为我们需要then第一个。这then需要以某种方式进行界定。所以:

if [ "$filesize" -lt 9999 ]; then
   echo "less"
fi

或者:

if [ "$filesize" -lt 9999 ]
then echo "less"
fi

从技术上来说,

if [ "$filesize" -lt 9999 ] & then
   echo "less"
fi
if ([ "$filesize" -lt 9999 ]) then
   echo "less"
fi

从语法的角度来看也可以工作,bash但这并不等效。第一个将[在后台运行该命令(我们只是测试它是否已在后台成功启动),而第二个将在子 shell 中运行它。

相关内容