bash:ユーザー入力を他の配列と一致させて置き換える

bash:ユーザー入力を他の配列と一致させて置き換える

まずはタイトルが残念ですね。私の抱負をどのように言葉で表現するのか分かりません。ただし、コーディング/スクリプトの観点からは非常に基本的でなければなりません。しかし、私は何とかそれを実装できませんでした:/

プロンプトまたはコマンドライン引数を介してユーザー入力を待つbashスクリプトがあります。許可された回答はほんの数回しかないので、配列と比較して確認します。今、私たちはそれを「パッケージ」と呼びます。許可される各回答は、他の項目に対する単純で人間が読めるエイリアスと同じです。これは配列の2行目で宣言されます。

declare -a packs=('low', 'mid', 'high')
declare -a packcontent=('1+1+2', '2+2+3', '3+3+4')

parameters=${packcontent[xxx]}

私が失敗したのは、最初の配列を2番目の配列に解析することです。ユーザー入力インデックスを変数に渡すことができるようにするにはどうすればよいですか?

例:ユーザーが「低」と言った場合は、「低」が最初の配列の最初の(0番目)要素であることに注意してください。したがって、2番目の配列の最初の(0番目)要素に「パラメータ」を割り当てる必要があります。

parameters=1+1+2

中間ステップが欠けているか、bashがそれを置き換えることができないかどうかはわかりませんが、これを達成する方法がわかりません。

私の問題の私の説明がそれほど混乱していないことを願っています。

ありがとうございます!

答え1

これはbash連想配列操作のように見えます!

文字列でインデックス付けされた配列を作成できます。他の言語では、「ハッシュ」または「マップ」として知ることができます。以下を考慮してください。

$ declare -A packs
$ packs=( [low]='1+1+2' [mid]='2+2+3' [high]='3+3+4' )
$ parameters=${packs[low]}
$ echo $parameters
1+1+2

答え2

ドラゴンの答え最新バージョンではすべてが問題ありませんが、bash4.0より前のバージョン(macOSなど)では通常の配列を使用する必要があります。

次のことができます。

packcontent=('1+1+2' '2+2+3' '3+3+4')
low=0 mid=1 high=2

parameters=${packcontent[mid]}

の値は、インデックス1の値であるためです$parameters。配列インデックスは算術的文脈で計算されるので( " ")プレフィックスを付ける必要はありません。2+2+3packcontentmid$$mid


(配列なし)の場合、/bin/sh脱出できます。

set -- '1+1+2' '2+2+3' '3+3+4'
low=1 mid=2 high=3

eval "parameters=\$$mid"

つまり、可能な引数のリストがに保持され、正しい引数は、に割り当てられたときに1つまたは正しい引数の"$@"助けを借りて参照されます。割り当てを実行すると、評価する文字列を取得し(この場合)値に置き換えます。$low$mid$highparametersevalparameters=$nn$mid

関連情報