2012-11-19 100 views
1

我有一個定義如下的函數。每次它通過數組運行時,我都希望它更新現有變量(${1}_FLAG})。不按我的意圖工作。基本上,如果存在所述包的新版本,請將該標誌設置爲true,以便我可以調用另一個函數。將變量值轉換爲bash中的新變量

刪除了「額外」變量,因爲人們被他們趕上了。我需要的是當它們被循環時更新HTTP_FLAGPHP_FLAGMOD_QOS變量。

HTTP_FLAG=false 
PHP_FLAG=false 
MOD_QOS=false 

PKGS=(HTTP PHP MOD_QOS); 

check_new_version() {   
    # If a new version is available, download the source file 
    if [ ${!check_version} != ${!current_version} ] 
    then 
     ... 
     ... 
     ${1}_FLAG=true 
    fi 
} 

for i in "${PKGS[@]}" 
do 
    check_new_version $i 
done 

if ${HTTP_FLAG}; then 
    ... 
    ... 
fi 
+0

你在哪裏設置'HTTP_VER' ,「HTTP_CURRENT」,「HTTP_LINK」等。人? – twalberg

+0

腳本上方相當長,我不認爲它們會相關。一個例子是'HTTP_LINK =「http://apache.ziply.com/httpd/${HTTP_VER}」' – luckytaxi

+0

請修改您的問題,以包含「不按我想要的方式工作」的演示,所需的輸出VS電流輸出。或者使用'set -vx和set + vx'打開/關閉shell調試跟蹤,以查看每個cmd/block是如何使用變量替換進行處理的。祝你好運。 – shellter

回答

1

我想你需要eval

$ set -- FOO 
$ FOO_FLAG=false 
$ eval ${1}_FLAG=true 
$ echo $FOO_FLAG 
true 
$ 

bash,你想使用的${!var}符號,但我沒能找到直接調用,將​​工作。這通過var變量靠攏,但也不能令人信服:

$ var=${1}_FLAG 
$ FOO_FLAG=false 
$ ${!var}=true 
bash: false=true: command not found 
$ : ${!var}=true 
$ echo $FOO_FLAG 
false 
$ 
+0

這正是我遇到的問題。 – luckytaxi

+0

我通過使用'export「$ {1} _FLAG」= true'來解決這個問題 – luckytaxi

0

bash有indirect parameter expansion,所以你可以做:

varname=${1}_LINK 
value=${!varname} 

例如

$ foo_LINK="hello world" 
$ set -- foo 
$ varname=${1}_LINK 
$ echo ${!varname} 
hello world