2014-03-26 33 views
1

我正在創建一個shell腳本,用於從數據庫檢索值並將其後臺處理爲文本文件。這些值將在數據庫中具有變量($ CURR_DATE $ SITE等)。所以當我想用這些變量執行程序時,我遇到了一個問題,它使用的是字符串而不是變量的值。例如從文本文件構建執行字符串

while read line; 
     do 
     Unix_Array[$counter]=$line; 
     let counter=counter+1; 
     done < parameterfile.txt 
     echo "Finished putting into array" 
     while [[ $c -lt ${#Unix_Array[@]} ]] 
     do 
      PARAMS="${PARAMS:-}${PARAMS:+ }${Unix_Array[$c]}" 
      ((c=$c+1)) 
     done 
echo "Finished creating parameter string" 


EXECUTE="$PROGRAM $USERID $PARAMS" 
echo $PARAMS 
$EXECUTE 

我認爲這是執行像

Program user/[email protected] $CURR_DATE $SITE 

,而不是被宣佈並且已經設置實際變量。

我該如何構建執行語句,以便它使用聲明的變量而不是文字變量。

回答

2

一旦你收集到的陣列,直接使用它:

typeset -a params 
while IFS= read -r line; do 
    params[n++]=$line; 
done < parameterfile.txt 

"$program" "$userid" "${params[@]}" 

至於包含變量的線,我會猶豫地推薦使用eval。參數文件是什麼樣的?誰有權寫信給它?

擺脫使用ALL_CAPS_VARS的習慣:有一天你會使用PATH或LANG,並想知道爲什麼「不起作用」。

+0

參數文件類似於param1 $ param2 param3 $ param4 1 US因此它的數據庫中的1列每個參數都由新行分隔,因此它看起來只有1列參數。 – Alkey29

+0

我在$ EXECUTE之前添加了eval,並且它正確執行。使用eval的問題是什麼? – Alkey29

+0

@ Alkey29如果你輸入了你無法控制的輸入(例如用戶有權寫入的文件中的數據「」「或來自命令行的參數),那麼''eval''是不安全的,你不想要執行任意代碼並且在大多數情況下可以避免。 –