2012-11-19 37 views
0

我目前想做一個變量名,將包括另一個變量爲什麼我不能這個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變量的內容。我嘗試了幾種不同的解決方案,但現在還沒有得到任何工作,如果有人能指出我做錯了什麼,儘管我會很感激,謝謝。

回答

7

你犯了一個錯誤的

$vname=$(...) 

,而不是你應該使用:

vname=$(...) 

在這樣分配的左邊不能使用$

一種解決方法是使用declare,如果你想要做間接變量引用

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

注意

正如在討論這個THEAD提到,不要使用eval做這個。 eval是一種常見的拼寫錯誤邪惡。見http://mywiki.wooledge.org/BashFAQ/048

+0

變量名稱是一個變量本身雖然,wouldnt帶走美元,因爲它不擴大? – lacrosse1991

+0

看到我編輯的帖子 –

+1

完美工作,謝謝!將不得不記住,在未來的eval ==邪惡大聲笑 – lacrosse1991

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 
+1

我不同意,這就是爲什麼我建議'申報'。如果不是絕對必要,應該避免使用「eval」。 'eval'是'邪惡'的常見拼寫錯誤。如果eval是答案,那麼你肯定會問錯誤的問題。見http://mywiki.wooledge.org/BashFAQ/048 –

+0

你知道我建議使用數組而不是eval,對吧?如果可能的話,應該避免使用eval。 –

+2

我建議如果有更好的選擇,甚至不會在對話中引入'eval'。 – chepner

相關問題