首页 > 解决方案 > 退出表单 shell 脚本未按预期工作

问题描述

我有一个使用 2 个不同参数调用两次的函数。该函数执行一些检查并在检查失败时退出执行。如果检查成功,则继续执行。但是在我的情况下,执行没有退出,它会继续第二次调用该函数。

我每次都调用该函数并将返回的值存储在变量中。根据我通过google和stackoverflow上的答案了解到的情况,问题似乎是当我调用函数将其存储在变量中时,它在子shell中运行并且“exit”只是退出执行子shell,而shell脚本继续执行。我提供以下代码:

check_profile_path() {
    local profileToCheck=$1
    if [ -e "$pdfToolBoxPath/used_profiles/Check$profileToCheck.kfpx" ]; then
        return 0
    else
        outputArr[status]="failed"
        outputArr[message]="profile configuration path for $profileToCheck not found at specified path"
        exitCode=1

        end_execution
    fi
}

check_profile() {
    local profileName=$1
    check_profile_path $profileName

    local containedText=$($someApplicationPath $somePath/used_profiles/Check$profileName.kfpx $fileToCheck)

    echo "<<<<<<<<<< $profileName >>>>>>>>>>"
    echo "$containedText"
    echo ""
}

end_execution() {
    jsonResult=$(create_json)

    echo $jsonResult
    exit $exitCode
}

colorSpaceProfileName="ColorSpace"
resolutionProfileName="Resolution"

colorSpaceCheckResult=$(check_profile $colorSpaceProfileName)
echo "$colorSpaceCheckResult"
resolutionCheckResult=$(check_profile $resolutionProfileName)
echo "$resolutionCheckResult"

我从中收到的输出是:

{"status":"failed","message":"profile configuration path for ColorSpace not found at specified path"}
<<<<<<<<<< Resolution >>>>>>>>>>
ProcessID   8..........

虽然我希望它只是:

{"status":"failed","message":"profile configuration path for ColorSpace not found at specified path"}

我无法设置正确的语法..请建议..

标签: bash

解决方案


exit结束当前进程。您正在调用您的函数,即 ,$(check_profile $colorSpaceProfileName)这意味着它们运行到自己的进程中,因此函数内部的退出仅离开该进程。

这里有两个解决方法:

  • 不要以这种方式收集函数的输出。在函数内收集它们并将它们存储到一个变量中,然后您可以在调用方检索该变量。

  • 安排函数设置退出代码,具体取决于调用者是否应该退出,并在调用方评估函数的退出代码,即:

    colorSpaceCheckResult=$(check_profile $colorSpaceProfileName)

    (( $? == 2 )) && exit

推荐阅读