ファイルサイズが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
1行にあるか、前に次のようにする必要があります;
。
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番目はサブシェルでコマンドを実行します。