아래 함수에서는 배열을 반복할 수 있으며, 일치하는 항목이 발견되면 루프를 중단하고 (예상대로) 프로그램의 나머지 부분을 계속 진행합니다.
그러나 일치하는 항목이 전혀 없으면 함수가 프로그램의 나머지 부분을 종료하도록 하고 싶습니다. 어떻게 해야 하나요? (처음으로 일치하는 항목을 찾지 못하면 종료할 수 없으며 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