Помощ за скрипт на Shell, как да пропусна файл за докладване на грешка?

Текущият ми shell скрипт е така:

for i in *.pdf
do
    convert -density 400 $i -depth 8 ${i/pdf/jpg}
done

for j in *.jpg
do
    tesseract -l eng $j ${j/.jpg}
    rm $j
    mv ${j}.txt textfile
done

Така че това, което грубо прави, е, че за всеки pdf файл го преобразува в jpg файл и за всеки jpg файл използвам teseract, за да го конвертирам в необработен текстов файл. Няма възможна грешка, идваща от преобразуването на pdf в jpg, но е възможно teseract да докладва грешки като: „Отменено повторение с дължина 0 поради присъединяване“. И скриптът ми спира от там... Има ли начин да направя скрипта си така, че да прескача, щом види някакво отчитане на грешка?? Така че не е необходимо да транскрибирам повредените jpg файлове и искам да ги пропусна. Всякакъв вид помощ ще бъде оценена!


person Sardonic    schedule 25.04.2013    source източник


Отговори (3)


Можете да проверите $? (кодът за връщане от предишната команда) и да излезете от скрипта, когато не е нула (напр. неуспешно).

[ $? != 0 ] && echo "Failed and died"
# More traditionally
if [ $? != 0 ] ; then
  return_val=$?
  echo "Failed with ${return_val} code"
  exit $return_val
fi

Можете също така да консолидирате вашите изходни потоци (stdout, stderr) в stdout и да вземете стойността

r=$(tessaract -l eng $j ... &>/dev/stdout)

И $r ще съдържа резултата от stderror.

Като алтернатива можете да изпратите изхода към друг файлов дескриптор, който сте създали чрез exec

person mango parade    schedule 25.04.2013
comment
правилният оператор за сравнение, който да се използва за сравнение без низове в този случай би бил -ne вместо !=. Също така в случай # More traditionally кодът за изход трябва да бъде записан преди if [ $? -ne 0 ], защото стойността на $? ще бъде зададена от кода за изход на [ $? -ne 0], така че винаги ще бъде 0 - person Alex; 25.04.2013

teseract връща грешка в командния ред.

for j in *.jpg
do
    tesseract -l eng $j ${j/.jpg}
    [ $? -ne 0 ]  && break
    rm $j
    mv ${j}.txt textfile
done
person jim mcnamara    schedule 25.04.2013
comment
Бихте ли ми казали какво [ $? -ne 0] линия прави?? Пробвах го и изглежда не работи. Искам да пропусне този jpg файл и да премине към следващия, но моят скрипт все още е закачен на грешката. - person Sardonic; 25.04.2013
comment
[ интервал $? -ne 0 интервал ] работи. Трябва да има интервал от двете страни на [ и ] Какво прави: тества изхода (върната стойност от tesseract. нула (0) означава, че съм завършил добре Всяка друга стойност означава, че съм се провалил. - person jim mcnamara; 25.04.2013

Ако вашият скрипт прекъсва, когато teseract се провали, тогава вероятно имате set -e в горната част на скрипта. Ако искате скриптът да прекъсне, когато teseract се провали, добавете set -e или проверете дали tesseract е успешен с едно от двете:

if ! tesseract -l eng $j ${j/.jpg}; then exit 1; fi

or

 tesseract -l eng $j ${j/.jpg} || exit 1
person William Pursell    schedule 25.04.2013