如何区分读取时返回的错误和shell脚本中的EOF

时间:2015-12-17 10:13:36

标签: shell unix error-handling ksh file-processing

我有上传分隔文件并进行处理的任务。一旦处理完成,我要么说它成功了,如果解析失败,我需要抛出错误。我在子脚本中逐行读取此文件,然后在主脚本中处理它(因此我不能在读取时使用ifs)。

我将重命名为.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,如果它的错误或解析失败。 请告诉我如何捕获错误。

1 个答案:

答案 0 :(得分:0)

您可以在子脚本中使用exit 1exit 0(使用0表示“无错误”),并检查父脚本中的返回值$?。如果要查看tail命令的退出代码,此解决方案将失败:$?将成为head -n1的exitcode。在ksh中,您无法使用Bash解决方案$ {PIPESTATUS}。处理此问题的最佳方法是用单个命令(sed ${lineno}'q;d' "${filename}")替换tail..head结构。

您的示例代码不完整,我不明白为什么您需要为每个调用获取一行。对于大文件,这是一个很大的开销。请考虑一下!