2012-02-17 38 views
1

我正在嘗試爲文件名數組遍歷一個路徑,然後對它們進行一些操作並填充爲一個字符串(格式正確)。下面的代碼/概念Bash Makefile連續排列

13 javascripts: setup 
14 i=0 
15 for source in `ls ${SOURCE_DIR}/js/*.coffee | sed -e "s:^.*\/\(\w*\).coffee:\1:"`; do\ 
16 sources[i]="--input ${OUTPUT_DIR}/js/$$source.js";\ 
17 i=$(i+1);\ 
18 echo "Compiling coffee script: $$source.coffee";\ 
19 coffee -bo "${OUTPUT_DIR}/js" -c "${SOURCE_DIR}/js/$$source.coffee";\ 
20 done;\ 
21 python2 ${CLOSURE_PATH}/bin/calcdeps.py --path ${CLOSURE_PATH}/../\ 
22 $${sources[0]} --compiler_jar ${CLOSURE_PATH}/bin/compiler.jar\ 
23 --output_mode compiled > ${OUTPUT_DIR}/compiled.js; 
24 echo "Cleaning ${OUTPUT_DIR}/js" 
25 @rm -rf ${OUTPUT_DIR}/js 

所以,我想加入一個數組爲字符串,並將其導出到開始上線21 python2命令。問題是我甚至無法訪問sources變量中的任何值。當我將21行替換爲echo $${sources[0]}時,它會輸出--input output/js/main.js這是正確的輸入。

怎麼辦?另外,如果你可以指出任何不在gnu.org(長=耗時)的bash/Makefile指南,我會很感激。我有用幾種語言編程的經驗,但用bash很少,所以在這一點上,這讓我發笑。

謝謝。

+0

如果你想運行python代碼,爲什麼不把所有東西寫在python中? – 2012-02-17 19:02:20

+0

該代碼不是我的 – farnoy 2012-02-17 19:03:58

+0

如果我正確地輸入了你想要完成的任務,我不認爲make文件會以這種方式工作。 (我會很高興?被證明是錯誤的;-)。你知道http://benjamin.smedbergs.us/pymake/嗎? '主要是GNU兼容的'make'的python實現,也許這會有所幫助。此外,還不清楚,你是否想單獨使用bash,看起來像你擁有什麼,或者make文件中的bash代碼?祝你好運。 – shellter 2012-02-17 19:32:54

回答

0

嘗試[@]

a=(1 2 3 4 5) 
echo "${a[1]}" # == 2 
echo "${a[@]}" # == 1 2 3 4 5 

還看到:http://tldp.org/LDP/abs/html/arrays.html

+0

如果我在shell上執行它,它可以很好地工作,但它無法在Makefile:'sources = $(ls $ {SOURCE_DIR}/js/*。coffee | sed -e「s:^。* \/\(\ w * \)。咖啡:\ 1:「); echo $ {sources [@]}; echo $$ {sources [@]}}; echo $$ {sources [@]}' – farnoy 2012-02-17 21:22:55

+0

cmd以上產生:'echo echo echo $ {sources [@]} '在每個回聲之間留有空行 – farnoy 2012-02-17 21:23:37

0

怎麼辦?

插入

set -x;\ 

線15之前,顯示所執行的命令。一個錯誤(不影響${source[0]}),你會發現是

 i=$(i+1);\ 

你似乎希望它不工作;寧願寫

 i=$$((i+1));\ 

- 美元符號的兩倍,因爲它在一個makefile中,並且加倍括號以獲得算術擴展;或更簡單

 ((i=i+1));\ 

得到算術評價。