2015-05-04 60 views
0

我想根據另一個變量在腳本中創建一個變量。在unix腳本里面創建變量

我只是不知道需要在我的代碼中調整什麼,如果有可能的話。 我正在簡化我的代碼以便您理解,所以這不是原始代碼。

的代碼是這樣說:

#!/bin/csh -f 

set list_names=(Albert Bela Corine David) 
set Albert_house_number=1 
set Bela_house_number=2 
set Corine_house_number=3 
set David_house_number=4 

foreach name ($list_names) 
    #following line does not work.... 
    set house_number=$($name\_house_number) 
    echo $house_number 
end 

所需的輸出應該是:

1 
2 
3 
4 

感謝您的幫助。

+0

可能有助於閱讀:[是否有可能從bash中的其他變量生成變量名?](http://stackoverflow.com/q/3963494/1983854) – fedorqui

+2

@fedorqui這些都看起來bash-,或至少POSIX特定。 'csh'是一個完全不同的野獸(值得大寫「B」)。 – Wintermute

+0

同樣的問題[也在這裏回答](http://stackoverflow.com/questions/27604063/variable-of-variable/27606472?s=12|5。2651) – Carpetsmoker

回答

1

不幸的是,bash主義${!varname}csh提供給我們,所以我們必須使用反引號和eval去老式的路線。 csh的引用規則不同於符合POSIX的外殼的引用規則,因此全部爲csh,具體爲。在這裏,我們去:

set house_number = `eval echo \" \$${name}_house_number\"` 
echo "$house_number" 

${name}擴展成backticked命令,所以這成爲等同於,比如說,

set house_number = `eval echo \" \$Albert_house_number\"` 

然後評估

echo " $Albert_house_number" 

而且由於反引號的,然後將其輸出分配給house_number

\$$之前的空格是必要的,以防擴展變量的值對回顯有特殊含義(例如-n)。我們不能簡單地使用echo "-n"(它不會打印任何東西),但echo " -n"是好的。

擴展反引號表達式時,額外的空間被剝去csh。這導致我們到剩下的注意事項:變量值中的空格將被剝離; csh的反作用。這意味着,如果Albert_house_number被定義爲

set Albert_house_number = "3 4" 

house_number最終會與值3 4(僅與一個空格)。我不知道一種方法來防止這種情況。

注意,在這種情況下,echo "$house_number"線必須也加以修正,否則將運行echo "-n"並沒有打印出任何東西,即使house_number具有正確的價值。

+0

謝謝Wintermute,這是一個完美的解釋,我學到了很多! – Tamir