2014-03-05 43 views
0

我要編譯寫這一切命令行的一些mysql的C API代碼和疲憊:慶典串和位置參數

gcc main.c -o main `mysql_config --cflags --libs` 

我在bash寫了一個shell腳本,並在bash傳遞位置參數:

gcc $1 -o ${"$1":0:2} 'mysql_config --cflags --libs'但這不起作用。我收到錯誤消息:./compile: line 2: ${"$1":0:-2}: bad substitution。有人可以告訴我我做錯了什麼嗎?

我得到這個工作的唯一方法是通過分配一個新的變量:

filename=$1; 
gcc $filename -o ${filename:0:-2} `mysql_config --cflags --libs` 

這是做到這一點的唯一方法或者是有辦法解決我在做什麼錯在第一種情況下?

+0

時候開始學習'make' ......或任何其他構建管理工具... – twalberg

+0

@ twalberg我認爲'make'只適合大型項目。這只是一個小測試程序。謝謝。 – user1527227

+0

雖然它確實爲大型複雜構建提供了最大優勢,但它對於小型單源構建也能很好地工作...... – twalberg

回答

3

你幾乎擁有了:

${1:0:2} 

你不需要因爲一切另一參考$1括號內它會被解釋爲變量的名稱,如在${filename:0:-2}的情況。

+1

+1一些好奇的解釋:'1' *是參數的名稱。但是,位置參數不是*變量*(即具有有效標識符作爲名稱的參數),因此您無法使用變量賦值分配給它; '1 = somestring'不起作用。要設置位置參數的值,您需要使用'set'命令。 – chepner

1

在回答這個問題下的評論,下面是這種情況的一個例子makefile

MSQL_FLAGS := $(shell mysql_config --cflags) 
MSQL_LIBS := $(shell mysql_config --libs) 

main : main.c 
     gcc $(MSQL_FLAGS) -o [email protected] $< $(MSQL_LIBS)