0

我目前正在尝试创建一个包含另一个变量的变量名

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 变量的内容。我已经尝试了几种不同的解决方案,但到目前为止还没有任何工作,如果有人能指出我做错了什么,虽然我真的很感激,谢谢。

4

2 回答 2

7

你犯了一个错误,而不是

$vname=$(... )

你应该使用:

vname=$(... )

您不能$像这样在分配的左侧使用。

declare如果要进行间接变量引用,则可以使用一种解决方法:

$ x=var
$ declare $x=test
$ echo $var
test

笔记

如本主题讨论中所述,请勿eval用于执行此操作。eval邪恶的常见拼写错误。见http://mywiki.wooledge.org/BashFAQ/048

于 2012-11-19T21:55:29.293 回答
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
于 2012-11-20T03:23:54.083 回答