在 Unix 中执行以下命令时出现错误:我希望第 3 行能够工作...在 ksh shell 中
while [ ${i} -le 3 ]
do
var${i}="hello${i}"
echo "${var}${i}"
i=`expr ${i} + 1`
done
我想要得到如下所示的输出,
hello1
hello2
答案1
在 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
扩展了其中的两个。为此,我们摆脱单(强)引号并插入$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
数组索引从 开始0
,并且数组是稀疏的(更像是键限于正整数的关联数组),而在所有其他 shell(包括zsh
和yash
在类似 Bourne 的前端)中,索引从 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]}"
答案2
使用循环就容易多了for
:
for i in 1 2 3; do
echo var$i\ =\ hello$i
done
测试于bash
.