Ksh

如何在while循環中動態使用變數

  • September 14, 2017

在 Unix 下執行時出錯:我希望第 3 行開始工作…在 ksh shell 中

while [ ${i} -le 3 ]
do
    var${i}="hello${i}"
    echo "${var}${i}"
    i=`expr ${i} + 1`
done

我想得到如下輸出,

hello1
hello2

在 POSIXsh中,您需要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/bashyash,您可能希望使用數組(或 中的關聯數組ksh93zsh或 的最新版本bash)。請注意,ksh/bash數組索引從 1 開始0並且數組是稀疏的(更像是鍵限制為正整數的關聯數組),而在所有其他 shell(包括zshBourne yash-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]}"

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