各ファイルの行数を計算するためにシェルスクリプトを実行しようとしていますが、行数が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
多くの問題があります:
foreach
bashキーワードではありません:使用for
- コマンドを実行するには、
$( ... )
角かっこの代わりに使用します。 - 括弧内のコマンドは実行する必要はなく、シェルを使用して拡張できます
for i in *.DAT; do
(通常は次を参照)。なぜ`ls`を解析しないのですか?) - 値が次より小さいか等しいかをテストします(参照
man test
)。if [ $a -le 2 ] ; then
for
aは次に終わります。done
end
- anは次
if
で終わりますfi
。endif
- ファイル名をパラメータとして指定すると、行数が
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