BASHスクリプトは「予期しないファイルの終わり」を返します。

BASHスクリプトは「予期しないファイルの終わり」を返します。

なぜ私はこれを受けているのか分かりません。私はこれが一般的な問題であるに違いないことを知っていますが、それを理解することはできません。

#!/bin/bash
 #Checks word count of each text file directory and deletes if less than certain   amount of words
 #Lastly, displays number of files delter

 count = 0 #Set counter to 0
 limit = 2000

 for file in *.txt
 do
     words = wc -w > $file
     if words < $limit
         rm $file
         count = $count + 1
     end
 end

 print "Number of files deleted: $count" 

ベストアンサー1

残念ながら、あなたのスクリプトに構文エラーがいっぱいです。あなたが見ている特定のエラーはforループを正しく閉じていないためですが、それ以外にははるかに多くのエラーがあります。

  1. =変数に値を割り当てるときはスペースを使用できません(算術式を除く)。
  2. コマンドの出力を変数に保存するには、以下を使用する必要があります。コマンドの置き換えvar=`command`いずれかvar=$(command)
  3. 変数の値を引用するときは、代わりに$varを使用する必要があります。var通常、"$var"引用符()で囲む必要があります。
  4. として算術比較、二重角かっこを使用-ltしない限り、コマンドを使用する必要があります。[<
  5. このcommand > file形式はfileコマンドの出力で上書きされます。wc < "$file"代わりに使用したいかもしれませんwc > $file
  6. var=$var+1変数が以前に整数として宣言されていない場合、変数に値を使用または追加すること((var=var+1))はできません。 1を追加するには、次のものを使用することもできます。var=$((var+1))declare -i var; var=var+1((var++))
  7. 構文ifが正しくありません。正しい形式は次のとおりです。if condition; then do something; fi
  8. forループでも同様です。for正しい構文は次のとおりです。for loop-specification; do something; done
  9. コマンドはありませんprint(とにかくbashに組み込まれていません)。ただprintfecho;
  10. あなたはする必要があります常に変数を引用してください。そうしない妥当な理由がなければです。

したがって、スクリプトの少し改善された作業バージョンは次のとおりです。

#!/bin/bash -
# Checks word count of each text file directory and deletes if less than certain   amount of words
# Lastly, displays number of files deleted

count=0 # Set counter to 0
limit=2000

for file in *.txt
do
     words=$(wc -w < "$file")
     if [ "$words" -lt "$limit" ]
     then
         rm -- "$file"
         ((count++))
     fi
done

echo "Number of files deleted: $count" 

次に、コーディングを試みる前に言語に慣れることをお勧めします。すべての言語には独自の規則と文法があります。

おすすめ記事