正在从awk退出主shell脚本

正在从awk退出主shell脚本,shell,awk,Shell,Awk,我有一个bash脚本调用一个jar文件,如下所示: awk -f fileformat.awk list.txt | while read arg1 arg2 arg3 arg4 arg5; do java -jar /bin/2dbf.jar arg1 arg2 arg3 arg4 arg5 if [[ ${?} -eq 0 ]]; then echo "2dbf.jar finished at: `date "+%F %T"`" ec

我有一个bash脚本调用一个jar文件,如下所示:

awk -f fileformat.awk list.txt | while read arg1 arg2 arg3 arg4 arg5; do    
    java -jar /bin/2dbf.jar arg1 arg2 arg3 arg4 arg5

    if [[ ${?} -eq 0 ]]; then
        echo "2dbf.jar finished at: `date "+%F %T"`"
        echo "---------------------------------------------"
    else
        echo "exiting..."
        exit 10
    fi
done
fileformat.awk
如下所示:如果行以
#
开头,或者没有5个字段,则退出程序

{ 
    if (NF == 5 && $1 !~ /#.*/) {
        print $0 
    } else { 
        print "incorrect file format"
        "exit 1"
    }
}

我想要的是
awk
脚本中的
exit 1
终止整个shell脚本。但是实际上它没有,jar文件因为错误的选项而抛出异常。

因为您的
退出
在AWK程序中被引用,它正在生成一个子shell并从中退出。而且因为您正在将错误消息打印到
stdout
,这将向
while
循环提供信息。将AWK脚本更改为此,它应该可以工作:

{ 
    if (NF == 5 && $1 !~ /#.*/) {
        print $0 
    } else { 
        print "incorrect file format" > "/dev/stderr"
        exit 1
    }
}

谢谢,它解决了我的问题。但是在awk脚本退出脚本后,
echo${?}
显示0而不是1。@MajidAzimi:这是因为它在管道中。请尝试
echo“${PIPESTATUS[@]}”
。该数组中的元素0是管道第一个成员的退出状态。