2016-07-06 71 views
2

定義多個變量,我想用makeeval功能定義foreach內幾個(動態命名)變量,但我不能讓eval做這個工作。化妝 - 在同一個EVAL呼叫

我想是這樣的:

$(eval \ 
    var1 = val1 \ 
    var2 = val2 \ 
) 

它不工作:var1被定義爲val1 var2 = val2並沒有定義var2。這是有道理的,因爲我把\放在第二行的末尾。但是如果我刪除它,eval調用永遠不會終止。

我嘗試過不同的事情,只有eval才能看到這個\,但沒有什麼關鍵的。因此,問題是:是否可以在同一個eval調用中定義多個變量?

當然,我可以撥打eval兩次......這很好奇。

+0

我不認爲這是可能的,因爲以更一般的方式,你不能在同一行中聲明兩個變量。它必須是由於解析的變量聲明的方式。無論如何,您可以將多個eval函數放入一個已定義的函數中,並只調用該函數,因此在調用時只需要一行。 – Tim

+0

@TimF我想你是對的。但是因爲'eval'可以用來解析'call'的結果,這是多行的,所以我希望能夠編寫一個「多行字符串」。 – lephe

+0

我試過多種解決方案,最後找到了答案,請參閱下面;) – Tim

回答

2

什麼分隔每個變量定義是換行符,你用反斜槓轉義。因爲你不能把它直接在eval功能,你必須定義它,並用它來爲eval這樣的:如果你把目標內以下行

define newline 


endef 

然後:

$(eval FOO=abc$(newline)BAR=def) 
@echo FOO : $(FOO) BAR : $(BAR) 

我們將看到這樣的結果:

FOO:ABC BAR:高清

請注意,如果你想在第二個的定義中使用的變量,你必須躲避$性格是這樣的:

$(eval FOO=abc$(newline)BAR=def$$(FOO)) 
@echo FOO : $(FOO) BAR : $(BAR) 

結果最終將:

FOO:ABC BAR:defabc

這是由於這樣的事實,有解釋之前eval實際開始做的工作(換行此添加)第一級,但我們想解釋的變量僅在真正的eval工作期間發生,當變量被定義時,這就是爲什麼我們需要雙$符號。

+0

這很聰明。它使得代碼更加輕鬆,正如我所尋求的。 +1 – lephe

+0

看來,如果第二個變量使用第一個變量,這個技巧就不起作用,例如, 'FOO = $ ABC(新行)BAR = FOO'。在這個例子中BAR保持空白。 – lephe

+0

@lephe:看到我的回答結束,我編輯它添加你要找的東西。 – Tim