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

これは二重ループを防ぎます。これは、配列またはレベルの数、または両方が非常に長い場合に便利です。

また、より一般的な=(...)形式の配列割り当てに切り替えました。

おすすめ記事