我正在尝试检查文件大小是否小于 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 在简单命令(如echo
or )的参数中不将其视为关键字[
。您会注意到它在以下情况中执行相同的操作:
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 中运行它。