私の最初のシェルは各ファイルの行数を数えます。

私の最初のシェルは各ファイルの行数を数えます。

各ファイルの行数を計算するためにシェルスクリプトを実行しようとしていますが、行数が2未満の場合は別のディレクトリに移動する必要があります。

シェル:

#!/bin/bash


foreach i in (ls *.DAT)
  a=`wc -l $i`
  if $a=<2 then
    mv $i aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup      
  endif
end

しかし、私のシェルでエラーが発生しました。

igud_to_backup.sh:行8:予期しない表示"("の近くに構文エラーがあります。

igud_to_backup.sh: 行8: `foreach i in (ls *.DAT)'

シェルスクリプトにはどのような問題がありますか?

答え1

多くの問題があります:

  • foreachbashキーワードではありません:使用for
  • コマンドを実行するには、$( ... )角かっこの代わりに使用します。
  • 括弧内のコマンドは実行する必要はなく、シェルを使用して拡張できますfor i in *.DAT; do(通常は次を参照)。なぜ`ls`を解析しないのですか?)
  • 値が次より小さいか等しいかをテストします(参照man test)。if [ $a -le 2 ] ; then
  • foraは次に終わります。doneend
  • anは次ifで終わりますfiendif
  • ファイル名をパラメータとして指定すると、行数がwc印刷されます。そしてファイル名。標準入力から<読むwc

要約する:

#!/bin/sh
for i in *DAT; do
  a=$( wc -l < "$i" )
  if [ "$a" -le 2 ] ; then
    mv "$i" aux1/pelvar/var/pel/projs/ar/shells/IGUD_OUT/backup
  fi
done

答え2

Matteoが言及したように、Perl構文を使用しようとしています。しなければならない。

for i in $(ls *.DAT); do
  if [ $(wc -l ${i}) -le 2 ]; then
    mv ${i} /path/to/
  fi
done

関連情報