Bash
以變數名呼叫其他變數(Bash)
目前我有下一條路徑
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
,您需要bash
4.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(這可能被認為有點脆弱,因為使用者可以輕鬆地將具有類似名稱的變數注入腳本環境)。此程式碼的輸出與上面的程式碼相同。