我目前正在尝试创建一个由另一个变量
组成的变量名while [ "$countf" -le 9 ]; do
vname=$( echo fcp"$countf" )
$vname=$( awk -F, -vs="\$fc$countf" '{for (i=1;i<=NF;i++)if($i~"^"s"$"){print i;exit;}}{print "not found"}' <<< $first_line )
countf=$(( countf + 1 ))
done
虽然当我去执行包含代码的脚本时,会输出以下内容:
fcp1=not: command not found
fcp1是vname变量的内容。我已经尝试了几种不同的解决方案,但是现在还没有任何工作可用,如果有人可以指出我做错了什么,虽然我真的很感激,谢谢。
答案 0 :(得分:7)
你犯了一个错误,而不是
$vname=$(... )
你应该使用:
vname=$(... )
您不能在分配的左侧使用$
。
如果要执行间接变量引用,解决方法是使用declare
:
$ x=var
$ declare $x=test
$ echo $var
test
注意强>
正如本文中的讨论所述,请勿使用eval
来执行此操作。 eval
是 evil 的常见拼写错误。见http://mywiki.wooledge.org/BashFAQ/048
答案 1 :(得分:0)
如果您要从以下部分构建变量名称,则需要使用eval:
$ cat tst.sh
countf=0
while (( $countf <= 2 ))
do
vname="fcp${countf}"
eval $vname="\$(date)"
countf=$(( countf + 1 ))
sleep 1
done
echo "$fcp0"
echo "$fcp1"
echo "$fcp2"
$ ./tst.sh
Mon Nov 19 21:22:05 CST 2012
Mon Nov 19 21:22:06 CST 2012
Mon Nov 19 21:22:08 CST 2012
但你应该认真考虑一个数组:
$ cat tst.sh
countf=0
while (( $countf <= 2 ))
do
fcpArr[$countf]="$(date)"
countf=$(( countf + 1 ))
sleep 1
done
echo "${fcpArr[0]}"
echo "${fcpArr[1]}"
echo "${fcpArr[2]}"
$ ./tst.sh
Mon Nov 19 21:22:48 CST 2012
Mon Nov 19 21:22:50 CST 2012
Mon Nov 19 21:22:51 CST 2012