Bash

以變數名呼叫其他變數(Bash)

  • April 7, 2018

目前我有下一條路徑

langs="EN GE"
dir_EN=/xx
dir_GE=/zz

如您所見,變數 $langs 在一個數組中包含所有可能的語言。我想使用一個檢查語言是什麼的循環將所有這些路徑保存在多語言(dir_ML)數組中,然後保存相應的路徑。這是我到目前為止所擁有的

for i in $(seq 0 1); do #I used seq because I didn't know how to specify the length of the variable $langs
   dir_ML[$i]=dir_${langs[$i]}
done

我正在尋找的輸出是

dir_ML[0]=/xx

dir_ML[1]=/zz

我希望你能明白我在做什麼!提前致謝

langs不是數組,而是程式碼中的字元串。

使其成為一個數組並使用它:

langs=( EN GE )
dir_EN=/xx
dir_GE=/zz

dir_ml=()
for i in "${langs[@]}"; do
   declare -n p="dir_$i"
   dir_ml+=( "$p" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

在上面的循環中,將$i依次獲取值。這也引入了一個名稱引用變數。當訪問 的值時,在聲明變數時分配給變數的字元串將被解釋為變數名並返回變數的值。EN``GE``p``p

上面的輸出將是

dir_ml = "/xx"
dir_ml = "/zz"

要在 中使用名稱引用bash,您需要bash4.3 或更高版本。


另一種(有趣但次要)的可能性:

dir_EN=/xx
dir_GE=/zz

# (can't set dir_ml=() here as its name would be picked up by the loop)
unset dir_ml

for i in "${!dir_@}"; do
   dir_ml+=( "${!i}" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

在這裡,$i將依次取變數名 dir_EN的值。dir_GE然後我們使用變數間接${!i}獲取該變數的值。這種變體不需要langs數組,而是假設沒有其他變數被命名為dir_-something(這可能被認為有點脆弱,因為使用者可以輕鬆地將具有類似名稱的變數注入腳本環境)。

此程式碼的輸出與上面的程式碼相同。

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