korn shell - 배열에 변수가 있으면 종료하지 않고 처리를 중지합니다.

korn shell - 배열에 변수가 있으면 종료하지 않고 처리를 중지합니다.

존재하는 우선순위가 가장 높은 항목만 처리되도록 배열에 있는 항목의 우선순위를 어떻게 평가합니까? 배열이 있다면 설명해 보겠습니다.

set -A array low medium none high 

배열은 나열된 요소 중 일부 또는 전부를 포함할 수 있는 명령을 실행하여 생성됩니다. 내가 원하는 것은 찾은 우선 순위가 가장 높은 요소를 평가하고 스크립트를 종료하지 않고 배열을 통한 반복을 중지하는 것입니다. 즉, low와 high가 존재하는 경우 배열을 계속 반복하지 않고 high만 평가됩니다. 중간 및 낮음이 있는 경우 중간만 평가되고 루프가 중지됩니다.

지금까지 내가 찾은 유일한 방법은 요소를 찾는 순서대로 여러 루프의 끔찍한 조합을 입력하는 것입니다. 요소가 발견되면 다음 루프로 이동하기 전에 종료하지만, 그것이 의미가 있다면 종료하거나 반환할 필요는 없습니다.

예는 다음과 같습니다.

#!/bin/sh

set -A array low medium none high

high() { 
        printf "High\n" 
}
medium() { 
        printf "Medium\n" 
}
low() { 
        printf "Low\n" 
}
none() { 
        printf "None\n" 
}

for i in ${array[*]}; do if [ ${i} = "high" ]; then high; exit 0; fi done
for i in ${array[*]}; do if [ ${i} = "medium" ]; then medium; exit 0; fi done
for i in ${array[*]}; do if [ ${i} = "low" ]; then low; exit 0; fi done
for i in ${array[*]}; do if [ ${i} = "none" ]; then none; exit 0; fi done

위의 코드를 사용하면 배열을 변경하고 요소를 꺼내면 거의 내가 평가하는 계층 구조를 기반으로 평가해야 합니다. 높음, 낮음, 중간, 존재하지 않는 경우 높음으로 인쇄하고 종료됩니다. high와 mid를 꺼내면 low로 인쇄되어 종료됩니다.

이 스크립트를 읽고 있는 또 다른 스크립트가 있으므로 종료하면 이를 로드한 부모를 포함하여 전체 체인이 종료됩니다. 따라서 누락된 최고 우선순위를 찾은 후 배열의 모든 항목 평가를 중지하는 방법을 알아내려고 합니다. 요소에 대한 더 나은 설명입니다.

존재를 제거하면 각 루프에 도달하고 각 루프의 출력을 제공합니다. elif와 else를 사용해 보았지만 성공하지 못했지만 항상 모든 요소를 ​​평가합니다.

어떤 아이디어가 있나요? 스크립트를 종료하지 않고 중지할 수 있습니까?

답변1

#!/bin/ksh

high ()   echo High
medium () echo Medium
low ()    echo Low
none ()   echo None

set -A array low medium none high

for level in high medium low none; do
    for elem in "${array[@]}"; do
        if [ "$elem" = "$level" ]; then
            "$level"
            break 2
        fi
    done
done

이것은 이중주기입니다. 외부 루프는 중요도 순으로 레벨을 순환합니다. 내부 루프는 배열의 요소를 반복하면서 현재 수준과 동일한 요소를 찾습니다.

현재 수준에 해당하는 요소가 발견되면 해당 수준과 동일한 이름을 가진 함수가 호출되고 두 루프가 모두 종료됩니다.

일반적인 경우 단어 분할 및 배열의 ​​문자열에 대한 파일 이름 글로빙을 사용 (및 따옴표 없이 확장)하는 "${array[@]}"대신 루프를 수행해야 합니다. 표현식은 배열에서 개별적으로 참조되는 요소로 확장됩니다 .${array[*]}[*]"${array[@]}"array

$elem단어 분할과 파일 이름 글로빙을 피하는 것도 $level두 가지를 모두 참조하고 비교하는 이유입니다.


잠재적으로 더 빠른 접근 방식은 먼저 배열의 요소를 키로 사용하여 연관 배열을 만든 다음 그 안에서 키 조회를 수행하는 것입니다.

#!/bin/ksh

high ()   echo High
medium () echo Medium
low ()    echo Low
none ()   echo None

array=( low medium none high )

typeset -A lookup

for elem in "${array[@]}"; do
    lookup["$elem"]=1
done

for level in high medium low none; do
    if [ -n "${lookup[$level]}" ]; then
        "$level"
        break 
    fi
done

이렇게 하면 이중 루프가 방지됩니다. 이는 배열이나 레벨 수 또는 둘 다 매우 긴 경우 유용할 수 있습니다.

또한 더 일반적인 =(...)형태의 배열 할당으로 전환했습니다.

관련 정보