Использование bash-скрипта для grep целого числа и сравнения его с другим

У меня есть скрипт bash для копирования файлов из одного места в другое, если оценка в файле меньше 36.

Я запускаю этот скрипт раз в месяц, и он работал раньше, но теперь я получаю сообщение об ошибке:

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 X 10.7, и в прошлом у меня были проблемы с моими скриптами bash, которые в остальном прекрасно работают на Linux-системах.

Заранее спасибо!

3 ответа

Решение

Это происходит, когда не было матча, $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

Я думаю, что вам также нужно больше знать о требованиях цитирования в сценариях оболочки.

Сехе прав, Или ты можешь сделать

if [[ $score < 36 ]]
then
cp "$f" "$2"
fi

На моем Mac работает Mountain Lion версии 10.8.4 я не вижу -P вариант с grep, Так что вы можете использовать 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
Другие вопросы по тегам