>我目前正在尝试制作一个由另一个变量组成的变量名称
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 变量的内容。我已经尝试了几种不同的解决方案,但到目前为止还没有任何东西可以工作,如果有人可以指出我做错了什么,尽管我真的很感激,谢谢。
你犯了一个错误,而不是
$vname=$(... )
您应该使用 :
vname=$(... )
您不能像这样在分配的左侧使用$
。
解决方法是使用 declare
如果要执行间接变量引用:
$ x=var
$ declare $x=test
$ echo $var
test
注意
正如本标题中的讨论中所述,请勿使用eval
来执行此操作。 eval
是邪恶的常见拼写错误。请参阅 http://mywiki.wooledge.org/BashFAQ/048
如果要
从这样的部分构建变量名,则需要使用 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