2013-04-09 70 views
0

我試圖做一個晚期綁定我的軟件包在make命令中的目錄。基本上,WITH_OPTIONS命令行包含空格分隔的鏈接選項列表,類似於配置腳本。問題在於,在解析了此腳本的命令行之後,目錄會很晚,所以我需要評估模板字符串以獲取正確的變量綁定。我可以跟這麼多的谷歌搜索和Bash的FAQ閱讀最近的地方,尤其是第50條是這樣的:Bash變量的晚期綁定,同時保留空間

MAKE_INSTALL="make install" 
TEMPLATE=('--first=$a' '--second=$b' '--third=$a') 

# Parse Parameters 
a=/first/path 
b=/second/path 
TEMPLATE_REPL=$(eval echo ${TEMPLATE[@]}) 
CMD="$MAKE_INSTALL WITH_OPTIONS=\"$TEMPLATE_REPL\"" 
$CMD 

我期望什麼$ CMD包含將用一個命令和2個參數的字符串:

make install WITH_OPTIONS="--first=/first/path --second=/second/path --third=/first/path" 

但是,我不能讓慶典保持報價的部分在一起,所以它保持它解析爲:

make install 'WITH_OPTIONS="--first=/first/path' '--second=/second/path' '--third=/first/path"' 

這顯然是完全錯誤的,並會造成不好的合作命令行執行時。

我錯過了什麼?如何將引號之間的位保存爲一個參數,而不是3?

+1

請記住,'make'根本不理解引號。 – 2013-04-09 21:01:08

+0

謝謝!我想你在這裏做些什麼!我認爲,無論ennuikiller可能是正確的,Array是真實的祕密,它需要一個雙重的eval visa-vi我提供的答案。 – TimeHorse 2013-04-09 21:04:48

回答

1

爲什麼不直接做模板的字符串:

TEMPLATE='--first=$a --second=$b --third=$a' 
$ a=/first/path 
$ b=/second/path 
$ eval echo $TEMPLATE 
--first=/first/path --second=/second/path --third=/first/path 
+0

對不起,我不得不撤消我的接受,因爲我檢查了。請記住,作爲我的代碼的結尾,您需要能夠執行$ CMD:'$ CMD',並且當我嘗試make時忽略雙引號並仍然讀取4個參數。 – TimeHorse 2013-04-09 20:56:09

1
MAKE_INSTALL="make install" 
TEMPLATE='--first=$a --second=$b --third=$a' 

# Parse Parameters 
a=/first/path 
b=/second/path 
CMD="$MAKE_INSTALL WITH_OPTIONS=\"$TEMPLATE\"" 
eval $CMD 

由於ennuikiller指出,數組是不必要的,但因爲喬納森·萊弗勒指出化妝,我試圖執行命令,是事忽略雙引號,正確的方法是在執行$ CMD時調用eval。這需要一些工作來適應我的腳本,但我認爲這是我設置該問題的基本解決方案。雖然我無法給ennuikiller充分的信任這個解決方案,但我很高興至少給你評分+1。

(主編:由於第二EVAL是必需的,所述第一個eval可以被移除。)

0

下面是使用在bash腳本後期綁定,具有變量(變量替換)的一個一般示例:

#!/usr/bin/env bash 

A_tmp="echo -n Late binding: \$B !!!"    ## note the slash before $ 
B="test string" 

A=`eval $A_tmp` 

echo $A 

此腳本打印:

Late binding: test string !!! 
+0

替代方案是: A_tmp =「遲綁定:\ $ B !!!」 ##注意$前面的斜槓然後:........................................ ........... A = \'eval echo -n $ A_tmp \' – user2299198 2013-04-26 06:59:49