为什么我不能将此awk语句的输出保存到变量中

时间:2012-11-19 21:53:37

标签: bash variables awk

我目前正在尝试创建一个由另一个变量

组成的变量名
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变量的内容。我已经尝试了几种不同的解决方案,但是现在还没有任何工作可用,如果有人可以指出我做错了什么,虽然我真的很感激,谢谢。

2 个答案:

答案 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