我的任务是上传分隔文件并对其进行处理。一旦处理完成,我要么说它成功,如果解析失败,我需要抛出错误。我在子脚本中逐行读取该文件,然后在主脚本中处理它(所以我在读取时不能使用 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
使用退出代码传达该信息。如果你想关注惯例,您可以使用例如
EX_DATAERR=65
将解析错误传达给父进程的代码:
孩子
exit "$EX_DATAERR"
家长
case "$?" in #$? is the exit code of the last exited child
0) echo 'Child has exited succesfully';;
"$EX_DATAERR") echo 'Child has experienced a parsing error';;
*) echo 'Child has experienced an unknown error';;
esac
就错误处理而言,shell 类似于 C 而不是 C++。它不会抛出。每个错误都必须由被调用者返回(对于进程来说,通过其退出代码返回,因为没有全局 errno(使用文件系统会很笨拙),并且调用者必须显式检查错误。
set -e
但是,如果未检查其退出状态(例如,在语句中if
)的任何子级返回非零退出状态,您可以在 shell 中执行以下操作,导致 shell 退出并出现错误。这有点像抛出一个无法捕获的异常。