Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在查找、while循环中设置返回(退出)代码_Bash_Variables_Loops_Global Variables_Exit Code - Fatal编程技术网

Bash 在查找、while循环中设置返回(退出)代码

Bash 在查找、while循环中设置返回(退出)代码,bash,variables,loops,global-variables,exit-code,Bash,Variables,Loops,Global Variables,Exit Code,我有这样的想法: find $1 | grep -E $2 | while read prom; do if [[ $prom =~ (cmd-given) ]]; then ... RETURN_PATH=$PWD cd $WORKING_PATH ... if [[ -s "stdou

我有这样的想法:

find $1 | grep -E $2  | while read prom; do
            if [[ $prom =~ (cmd-given) ]];
            then
                ...
                RETURN_PATH=$PWD
                cd $WORKING_PATH
                ...
                if [[ -s "stdout-delta" ]] || [[ -s "stderr-delta" ]] || [[ -s "status-delta" ]];
                then
                    RET_ERROR=1
                    RESULT="FAILED"
                else
                    RESULT="OK"
                fi
                ...
                echo "$TEST: $RESULT\n" > /dev/stderr
                cd $RETURN_PATH
            fi
        done

我想做一个测试,如果在每个文件夹有cmd给空文件x-三角洲检查。如果这些文件中的任何一个不是空的,我希望写入失败并将返回代码设置为1。但我想检查所有文件夹,所以我认为我使用变量,将其设置为1,最后检查它是否等于1,即退出1,否则退出0。但有一个问题,当我从那个循环中出来时,我的变量中并没有1。那么我应该如何解决这个问题呢?

循环在子流程中运行,因此您必须使用某种形式的IPC与原始流程(shell)通信

最简单的解决方案可能是将错误消息回显到stdout,并在while循环之后添加一个管道来解析输出。一个简单的grep就足够了。只需确保没有其他命令可以将“失败”写入标准输出

find $1 | grep -E $2  | while read prom; do
            if [[ $prom =~ (cmd-given) ]];
            then
                ...
                RETURN_PATH=$PWD
                cd $WORKING_PATH
                ...
                if [[ -s "stdout-delta" ]] || [[ -s "stderr-delta" ]] || [[ -s "status-delta" ]];
                then
                    RET_ERROR=1
                    RESULT="FAILED"
                    echo $RESULT
                else
                    RESULT="OK"
                fi
                ...
                echo "$TEST: $RESULT\n" > /dev/stderr
                cd $RETURN_PATH
            fi
        done | grep -q FAILED
[ "$?" == 0 ] && exit 1
编辑:基于临时文件的解决方案:

TMPFILE=$0.tmp
trap "rm -f $TMPFILE; exit 1" 0 1 2 3 13 15
find $1 | grep -E $2  | while read prom; do
            if [[ $prom =~ (cmd-given) ]];
            then
                ...
                RETURN_PATH=$PWD
                cd $WORKING_PATH
                ...
                if [[ -s "stdout-delta" ]] || [[ -s "stderr-delta" ]] || [[ -s "status-delta" ]];
                then
                    RET_ERROR=1
                    RESULT="FAILED"
                    echo $RESULT >> $TMPFILE
                else
                    RESULT="OK"
                fi
                ...
                echo "$TEST: $RESULT\n" > /dev/stderr
                cd $RETURN_PATH
            fi
        done

grep -q FAILED $TMPFILE && rm $TMPFILE && exit 1
rm $TMPFILE && exit 0
编辑2:基于功能的解决方案

process () {
    find $1 | grep -E $2 | (cat; echo EXIT_MARKER) | while read prom; do
            [[ $prom == "EXIT_MARKER" ]] && exit $EXIT_STATUS
            if [[ $prom =~ (cmd-given) ]];
            then
                ...
                RETURN_PATH=$PWD
                cd $WORKING_PATH
                ...
                if [[ -s "stdout-delta" ]] || [[ -s "stderr-delta" ]] || [[ -s "status-delta" ]];
                then
                    RET_ERROR=1
                    RESULT="FAILED"
                    EXIT_STATUS=1
                else
                    RESULT="OK"
                fi
                ...
                echo "$TEST: $RESULT\n" > /dev/stderr
                cd $RETURN_PATH
            fi
        done
    exit 0
}

process $1 $2
exit $?

我理解您的解决方案,但会有一个问题,我正在使用echo来编写得到的测试和结果,所以我不能仅用于错误代码。我知道在我的代码中我回显到stderr,但是当回显“$TEST…”到stdout时,我需要一个解决方案。如果打印的任何行包含“FAILED”的任何地方,则末尾的grep将返回TRUE。所以,如果我理解正确的话,即使在向stdout回显各种内容时,它也应该仍然有效;如果没有任何不希望出现的“失败”字符串,这就是我需要的,我喜欢它,但我有一个问题,grep总是在$中返回1?。我不在乎是否有“失败”的地方,它总是返回1。我的错误在那里。请使用新版本再试一次(最后一行已更改)。现在它工作正常,但这是/dev/stderr的输出的一部分,我需要在更改参数时,它应回显
“$TEST:$RESULT\n”>/dev/stdout
,但grep正在接受所有的stdout。最后一件事,你是如何改变它的?