2012-10-09 72 views
6

有沒有更好的方式來獲得一個GNU make變量的第一個字符不是得到一個make變量的第一個字母

FIRST=$(shell echo $(VARIABLE) | head -c 1) 

(這不僅笨重,而且調用外殼)?

+0

GNU make有沒有內置SUBST環功能,所以我不認爲這很容易或明顯。也許你可以想出一些涉及'$(patsubst)'的東西,但我無法做到。 – tripleee

+1

可能的重複:http://stackoverflow.com/questions/3703881/how-to-return-the-first-character-of-a-variable-in-gmake –

回答

7

這是很可怕的,但至少它不會調用shell

$(eval REMAINDER := $$$(VAR))   # variable minus the first char 
FIRST := $(subst $(REMAINDER),,$(VAR)) # variable minus that 
+2

我看到你在那裏做了什麼。這確實是一個有趣的黑客行爲,如果由於某種原因'$($ FIRST)'非空,它會中斷,所以如果第一個字母本身就是一個已定義的變量,不是嗎? – Anaphory

+0

@Anaphory,是的,它會的。我看不出有什麼辦法來防止這種情況。 – Beta

2

GNU Make Standard Library提供了substr功能

SUBSTR

Arguments: 1: A string 
      2: Start offset (first character is 1) 
      3: Ending offset (inclusive) 
Returns: Returns a substring 

我沒有測試它,但$(call substr,$(VARIABLE),1,1)應該工作

+1

我認爲應該是'$(call substr,$(VARIABLE),1,1)'。 –

+0

gmsl似乎不適用於automake。在添加'include gmsl'行之後,我得到了一些關於if/else/endif不匹配的錯誤。 –

+0

@CraigMcQueen,1)哎呀,謝謝,修正。 2)不能幫助你,對不起 –

0

因爲我在自己的搜索過這個來了,並沒有發現什麼,我一直在尋找這裏是我結束了使用解析,可以適用於任何已知的字符集的十六進制數

letters := 0 1 2 3 4 5 6 7 8 9 a b c d e f 
nextletter = $(strip $(foreach v,$(letters),$(word 2,$(filter $(1)$(v)%,$(2)) $v))) 

然後

INPUT := 40b3 
firstletter := $(call nextletter,,$(INPUT)) 
secondletter := $(call nextletter,$(firstletter),$(INPUT)) 
thirdletter := $(call nextletter,$(firstletter)$(secondletter),$(INPUT)) 

這是醜陋的,但它的外殼不可知

相關問題