일치하는 항목이 없으면 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

관련 정보