Bash

用於搜尋 bash 數組的使用者輸入

  • February 17, 2020

伙計們——

我有點卡住了,在這裡。我有一個小腳本,它將被合併到一個更大的腳本中。這個小塊應該接受使用者輸入,並將其與儲存的變數列表進行比較。如果使用者輸入與列出的變數之一匹配,它應該輸出作為該變數的字元串;或者,如果它不匹配任何元素,那麼它應該將使用者輸入寫入一個新變數。

對於上下文,我所做的是將一些變數定義為字元串(在這種情況下,是教科書的引文資訊)。舉個例子:

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它們附加到列表中。我想做的是提示使用者在源上輸入:如果他們輸入buffa7or giancoli6$source則應將變數重新定義為分配給相應變數的文本。如果使用者輸入與這些不匹配,$source則應將變數定義為使用者輸入的任何內容。

我似乎遇到的問題是,當使用者輸入源資訊時,如果他們使用buffa7,bash 似乎認為如果實際字元串buffa7不在其列表中,那麼它不必做任何事情,並認為buffa7不在列表中(這是真的,因為$buffa7是)。任何有關如何進行的建議將不勝感激!

這可以使用名稱引用或變數間接來完成,但您應該使用關聯數組。每個條目都不需要變數,當關聯數組可以處理整個批次時。

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

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