Ksh
如何在while循環中動態使用變數
在 Unix 下執行時出錯:我希望第 3 行開始工作…在 ksh shell 中
while [ ${i} -le 3 ] do var${i}="hello${i}" echo "${var}${i}" i=`expr ${i} + 1` done
我想得到如下輸出,
hello1 hello2
在 POSIX
sh
中,您需要eval
使用具有動態名稱的變數。i=0 while [ "$i" -le 3 ] do eval ' var'"$i"'="hello${i}" echo "var$i = ${var'"$i"'}" ' i=$((i+1)) done echo "${var1}"
使用時
eval
,確保只有需要擴展的變數在傳遞給的參數中才被擴展eval
(並且它們的值被清理(這裡我們知道它們是十進制數字的安全序列)),這一點至關重要。上面只有兩個
$i
’s 被擴展。為此,我們擺脫單(強)引號並插入$i
內部雙引號:eval '...'"$i"'...'
.因為要正確引用非常困難(如果不這樣做很危險),最好盡可能限制使用
eval
。理想情況下,僅將動態變數的內容傳輸到靜態變數和/或返回,例如:i=0 while [ "$i" -le 3 ] do var=hello$i # $var with static name eval "var$i=\$var" # transfer into variable with dynamic name echo "var$i = $var" # use var with static name instead of dynamic one # everywhere else (for which we don't need eval) i=$((i+1)) done echo "${var2}"
在
ksh
//zsh
/bash
中yash
,您可能希望使用數組(或 中的關聯數組ksh93
,zsh
或 的最新版本bash
)。請注意,ksh
/bash
數組索引從 1 開始0
並且數組是稀疏的(更像是鍵限制為正整數的關聯數組),而在所有其他 shell(包括zsh
Bourneyash
-like 前端)中,索引從 1 開始,數組是普通數組。在
ksh
/bash
/zsh -o ksharrays
:unset -v var i=0; while [ "$i" -le 3 ]; do var[i]=hello$i echo "var[$i]=${var[i]}" i=$((i+1)) done echo "${var[1]}"
或者使用/ /通用的 POSIX 語法的另一個
((...))
擴展:sh``ksh``zsh``bash
unset -v var i=0; while ((i <= 3)); do var[i]=hello$i echo "var[$i]=${var[i]}" ((++i)) done echo "${var[2]}"
或與
ksh93
,bash
,zsh -o ksharrays
:unset -v var for ((i = 0; i <= 3; i++)); do var[i]=hello$i echo "var[$i]=${var[i]}" done echo "${var[3]}"