予想される「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ステートメントはthen1行にあるか、前に次のようにする必要があります;

    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

thenシェルが、echoまたは同じ単純なコマンドの引数でキーワードをキーワードとして扱わない場合でも、キーワードを識別するstackexchangeの構文を強調しないでください[。次のような状況でも同じことがわかります。

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が、同じではありません。最初は[バックグラウンドでコマンドを実行し(バックグラウンドで正常に開始されたかどうかをテストします)、2番目はサブシェルでコマンドを実行します。

関連情報