在 Bash 中迭代数组;如果没有找到匹配项则退出

在 Bash 中迭代数组;如果没有找到匹配项则退出

在下面的函数中,我可以迭代数组,如果找到匹配项,则跳出循环并继续程序的其余部分(按预期)。

不过,如果完全没有找到匹配项,我希望该函数退出程序的其余部分。我怎样才能做到这一点? (我不能让它在第一次找不到匹配项时退出,并且将 an 放在exit 1循环末尾并不能达到我的目的)。

我确信我忽略了一些显而易见的事情,但是什么呢?

#!/usr/bin/env bash 

# Array 
MATLAB_VERSION=(
    MATLAB9.4.app
    MATLAB9.3.app
    MATLAB9.2.app
    MATLAB9.1.app
    MATLAB9.0.app
    MATLAB8.6.app
    MATLAB8.5.app
    MATLAB8.3.app 
    MATLAB8.0.app 
    MATLAB7.5.app 
    MATLAB.app 
)

matlab_check() { 
    # is MATLAB*.*.app installed in /Applications?  
    # iterate through array & tell me what you find 

    for MATLAB in "${MATLAB_VERSION[@]}"; 
    do  
        if [ -d "/Applications/$MATLAB" ]; then 
            printf "%s\\n" "FOUND $MATLAB IN /Applications, CONTINUING..."
            break 
        else 
            printf "%s\\n" "SEARCHING for $MATLAB in /Applications..." 
        fi 
    done 
} 

matlab_check 

答案1

当您找到匹配项时,您可以return立即从整个功能中进行操作。这样,您可以在循环之后有一个“尾部部分”,仅在未找到匹配项时才运行。像这样的东西:

#!/usr/bin/env bash 
# You might not care for this declaration of the array contents,
# but it does the same thing, and keeps my example nice and short
MATLAB_VERSION=( MATLAB{9.{4..0},8.{6,5,3,0},{7.5,}}.app )

# RC 0 = found
# RC 1 = not found
matlab_check() {
    for MATLAB in "${MATLAB_VERSION[@]}"; do
        if [ -d "/Applications/${MATLAB}" ]; then
            echo "Found in ${MATLAB}"
            return 0
        fi
    done

    return 1
}

matlab_check
echo rc is $?

如果您不想输出发现地点的详细信息,则该if..fi 部分可以减少到仅此。不需要使用,return 0因为此时我们知道 $?必须为 0,因此return没有参数。

[ -d "/Applications/${MATLAB}" ] && return

相关内容