Bash

bash:用另一個數組匹配和替換使用者輸入

  • September 27, 2019

首先,對不起標題。我不知道如何用幾句話來表達我的雄心壯志。但是,從編碼/腳本的角度來看,它應該是非常基本的。雖然,我不知何故未能實現它:/

我有一個等待使用者輸入的 bash 腳本(通過提示符或命令行參數)。由於只有少數可接受的答案,我將它們與數組進行檢查。我們暫時稱它為“包”。每個接受的答案都類似於其他東西的簡單易讀的別名。這將在第二行的數組中聲明。

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

parameters=${packcontent[xxx]}

我失敗的地方是用第二個數組解析第一個數組。如何獲取使用者輸入的索引以便將其傳遞到變數中?

範例:如果使用者說“低”,它應該注意到“低”是第一個數組的第一個(第零個)元素。因此,“參數”應分配給第二個數組的第一個(第零個)元素。

parameters=1+1+2

我不確定我是否錯過了中間步驟或 bash 不能替代它,但我不知道如何實現這一點。

希望我對這個問題的解釋沒有那麼混亂。

親切的問候!

這看起來像是 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

wyrm 的回答在使用最新版本時非常好bash,但是對於 4.0 之前的版本(例如在 macOS 上),您將不得不依賴普通數組。

您可以這樣做:

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

parameters=${packcontent[mid]}

in 的值$parameters將是2+2+3因為那是索引 1 in 的值packcontentmid不需要以$(" " $mid) 作為前綴,因為數組索引是在算術上下文中計算的。


對於/bin/sh(無數組),您可能會逃脫

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

eval "parameters=\$$mid"

也就是說,可能的參數列表保存在 中,"$@"並且在其中之一的幫助下或在分配給時引用$low正確$mid$high參數parameters。執行分配eval將獲得parameters=$n要評估的字元串,並n替換為$mid(在這種情況下)的值。

引用自:https://unix.stackexchange.com/questions/539879