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 に答える