ユーザー入力による bash 配列の検索

ユーザー入力による bash 配列の検索

みんな--

ここで少し詰まっています。より大きなスクリプトにマージされる小さなスクリプトがあります。この小さなフラグメントはユーザー入力を受け入れ、それを保存された変数のリストと比較する必要があります。ユーザー入力がリストされている変数の1つと一致する場合は、その変数の文字列を出力する必要があり、どの要素とも一致しない場合は、ユーザー入力を新しい変数に書き込む必要があります。

文脈上私がしたことは、いくつかの変数を文字列(この場合は教科書の引用情報)として定義することでした。たとえば、

books=()

buffa7="Wilson, Buffa, Lou. Physics. Pearson, 7th edition, 2009. ISBN: 0321601831"
books=+("$buffa7")

giancoli6="Giancoli, Douglas C. Physics: Principles with Applications. Prentice Hall, 6th edition. ISBN: 0321736990"
books=+("$giancoli6")

このコードの私の理解は、配列を作成し、books変数をインポートして$buffa7リスト$giancoli6に追加することです。私が望むのは、ユーザーにソースへの入力を要求することです。ユーザーがまたはbuffa7を入力すると、その変数に割り当てられたテキストでgiancoli6変数をオーバーライドする必要があります。$sourceユーザー入力がこれと一致しない場合、変数はユーザーが入力した$sourceとおりに定義する必要があります。

私が経験しているような問題は、ユーザーがソース情報を入力するときにyesをbuffa7使用する場合です。進行方法の提案があれば大変お世話になります!buffa7buffa7$buffa7

答え1

これは名前参照または変数間接指定を使用して実行できますが、実行する必要があるのは連想配列を使用することです。連想配列が項目全体を処理できる場合は、項目ごとに変数を使用する必要はありません。

declare -A books
books[buffa7]="Wilson, Buffa, Lou. Physics. Pearson, 7th edition, 2009. ISBN: 0321601831"
books[giancoli6]="Giancoli, Douglas C. Physics: Principles with Applications. Prentice Hall, 6th edition. ISBN: 0321736990"

それから:

read input
source=${books[$input]}   # set $source to entry from array
if [[ -z $source ]]       # if $source is empty after that
then                      # $input was not in array, so
    source=$input         # set $source to $input.
fi

関連情報