Использование 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