2013-04-25 107 views
0

我現在的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文件,併爲我用的Tesseract將其轉換爲原始的每一個JPG文件文本文件。從pdf轉換爲jpg沒有任何錯誤,但tesseract可能會報告錯誤,例如:「由於已加入而取消了長度爲0的重複」。我的腳本從那裏停止... 是否有辦法讓我的腳本儘可能地跳過,只要它看到某種錯誤報告?所以我不需要轉錄損壞的jpg文件並想跳過它們。 任何形式的幫助,將不勝感激!

回答

0

您可以檢查$?(上一個命令的返回碼),並在腳本非零(例如失敗)時退出腳本。

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

您也可以鞏固你的輸出流(標準輸出,標準錯誤)到標準輸出,並採取價值

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

而且$r將包含stderror結果。

或者,您可以發送輸出到您創建另一個文件描述符通過exec

+0

所以我寫的[$? != 0]部分在我的代碼? – Sardonic 2013-04-25 02:35:21

+0

在這種情況下,用於非字符串比較的正確比較運算符將是'-ne'而不是'!='。同樣在#更傳統的情況下,退出代碼必須保存在'if [$? -ne 0]',因爲'$?'的值將由[[$?]的退出碼設置。 -ne 0]',所以它總是'0' – Alex 2013-04-25 02:57:34

0

正方體返回錯誤的命令行。

for j in *.jpg 
do 
    tesseract -l eng $j ${j/.jpg} 
    [ $? -ne 0 ] && break 
    rm $j 
    mv ${j}.txt textfile 
done 
+0

你能告訴我什麼[$? -ne 0]行呢?我試了一下,似乎沒有工作。我希望它跳過那個jpg文件並轉到下一個,但是我的腳本仍然掛在錯誤上。 – Sardonic 2013-04-25 02:34:36

+0

[space $? -ne 0 space]起作用。必須在[和]兩邊都有一個空格:測試退出(從tesseract返回的值,零(0)意味着「我完成了好」任何其他值意味着「我失敗」。 – 2013-04-25 10:08:25

0

如果在正方體失敗腳本正在中止,那麼你可能有set -e附近的腳本的頂部。如果您想在正方體失敗腳本中止,添加set -e或檢查tesseract與要麼成功:

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

tesseract -l eng $j ${j/.jpg} || exit 1