みんな--
ここで少し詰まっています。より大きなスクリプトにマージされる小さなスクリプトがあります。この小さなフラグメントはユーザー入力を受け入れ、それを保存された変数のリストと比較する必要があります。ユーザー入力がリストされている変数の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
使用する場合です。進行方法の提案があれば大変お世話になります!buffa7
buffa7
$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