一致するものがない場合、Bashは配列を繰り返します。

一致するものがない場合、Bashは配列を繰り返します。

以下の関数では配列を繰り返すことができ、一致するものが見つかったらループを中断し(予想どおり)、プログラムの残りの部分を続けます。

しかし、一致するものがまったくない場合は、関数がプログラムの残りの部分を終了するようにしたいと思います。どうすればいいですか? (最初に一致するものが見つからない場合は終了できません。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

おすすめ記事