2015-12-17 21 views
1

我有上傳分隔文件並處理它的任務。一旦處理完成,我要麼說它的成功,如果解析失敗,我需要拋出錯誤。我在子腳本中逐行讀取這個文件,然後在主腳本中處理它(所以我不能在讀取時使用ifs)。如何區分讀取時返回的錯誤以及shell腳本中的EOF

在所有行被解析的情況下,我將其重命名爲.done。現在我想知道在EOF達到之前何時出現錯誤,以便我可以將其重命名爲.err。如果我在最後有一個沒有換行符的文件呢?

結構如下主要是:

Main script: 
Calls parent script with filepath 
gets the fileName and no of line in the files, calls the Child script with a nth line no in a loop until total no of lines are reached 

Parent script: 
#some validations to get the txt file from the list of files 
... 
fileName=`ls -A1 *.txt` 
... 

Child script: 
... 
lineno=$1 
fileName=$2 
noOfLines=$3 
line=`tail -$lineno $fileName | head -n1` 

if [ $lineno -eq $noOfLines ] 
then 
    noExt="${fileName%.*}" 
    mv "$fileName" "$noExt.done" #success case 
fi 

現在我還需要重命名該文件,如果其錯誤或解析失敗.ERR。 請讓我知道如何捕捉錯誤。

回答

0

您可以使用您的孩子腳本exit 1exit 0(用0表示「沒有錯誤」),並在父腳本檢查返回值$?。當您想要查看tail命令的退出代碼時,此解決方案將失敗:$?將是head -n1的退出代碼。在ksh中,您不能使用Bash解決方案$ {PIPESTATUS}。處理這個問題的最好方法是用一個命令(sed ${lineno}'q;d' "${filename}")替換tail..head結構。

您的示例代碼不完整,我不明白爲什麼每次調用都需要一行。對於一個大文件來說,這是相當大的開銷。請考慮一下!

+0

'mksh'支持'$ {PIPESTATUS [*]}''。 – mirabilos

1

在shell中,您使用read進行了讀取,而不是通過遍歷headtail的行。話雖這麼說,POSIX標準狀態,在它的描述:

EXIT STATUS 

    The following exit values shall be returned: 
0 
     Successful completion. 
>0 
     End-of-file was detected or an error occurred. 

這意味着你無法 EOF和誤差之間在外殼閱讀區分開來。

至於另一個子問題,有good reasons why files must have a trailing newline;我曾經見過sed(1)或者在某個unixoid系統上沒有采取行動,甚至剝奪最後一行,如果它沒有的話。