1

ファイル内のスコアが 36 未満の場合に、ある場所から別の場所にファイルをコピーする bash スクリプトがあります。

このスクリプトを月に 1 回実行し、以前は機能していましたが、現在はエラーが発生しています。

line 5: [: -lt: unary operator expected

スクリプトは次のとおりです。

#!/bin/bash
for f in `ls $1/*.html`
do
        score=`grep -o -P '(?<=ADJ. SCORE: )-?[0-9]?[0-9]' $f`
        if [ $score -lt 36 ]
                then cp $f $2
        fi
done

OS が重要かどうかはわかりません。私は OS X 10.7 を使用していますが、過去に Linux ボックスでうまく動作する bash スクリプトに問題がありました。

前もって感謝します!

4

3 に答える 3

1

sehe は正しいです, またはあなたが行うことができます:

if [[ $score < 36 ]]
then
cp "$f" "$2"
fi
于 2013-07-09T23:25:17.507 に答える
0

Mountain Lion バージョン 10.8.4 を実行している私の Mac では、-Pオプションが表示されませんgrep。そのため、代わりに forを使用できますperl(ほとんどのスクリプトを再利用します):

#!/bin/bash

for f in "${1}"/*.html; do    # Don't parse ls
  score=$(perl -ne "print $& if /(?<=ADJ. SCORE: )-?[0-9]?[0-9]/" "$f")
  if [ "$score" -lt 36 ]; then 
    cp "$f" $2
  fi
done
于 2013-07-10T01:06:06.487 に答える
0

これは、一致するものがない場合に発生し$score、空の文字列です。

簡単な修正:

#!/bin/bash
for f in `ls $1/*.html`
do
        score=`grep -o -P '(?<=ADJ. SCORE: )-?[0-9]?[0-9]' $f`
        if [ -z $score ]
        then
            echo "No match in '$f'"
        else
            if [ "$score" -lt 36 ]
            then 
                cp "$f" "$2"
            fi
        fi
done

シェルスクリプトでの引用要件についても、もっと意識する必要があると思います。

于 2013-07-09T22:53:14.887 に答える