在Unix下执行以下操作时出错:我希望第三行开始工作...在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
扩展了两个。为此,我们去除单引号(强引号)并插入$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
和阵列稀疏(更像键关联数组限于正整数),而在所有其他的壳(包括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]}"
或使用/ /通用((...))
的POSIXsh
语法的另一个扩展: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]}"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句