2014-12-05 164 views
5

的特定值在我的生成設置我有定義一些預處理宏獲取預處理器宏

SANDBOX_ENV = 1

我想用SANDBOX_ENV的價值在我的shell腳本。

我已經回聲試圖"SANDBOX value is = ${GCC_PREPROCESSOR_DEFINITIONS}"

但它給我像DEBUG=1 SANDBOX_ENV=1 COCOAPODS=1

我想使用分配給SANDBOX_ENV

+0

可以解析的$ {} GCC_PREPROCESSOR_DEFINITIONS的字面意義?您可以在shell腳本中將該文字值作爲命令執行。然後,相應的shell環境變量將被設置爲這些值。 (不記得手頭的語法......) – 2014-12-09 09:22:49

+0

我不知道shell腳本。將嘗試搜索命令。 – 2014-12-09 09:29:07

回答

6

值試試這個所有的宏值:

#!/bin/bash 
GCC_PREPROCESSOR_DEFINITIONS="DEBUG=1 SANDBOX_ENV=1 COCOAPODS=1" 
# delete everything before our value ans stuff into TMPVAL 
TMPVAL="${GCC_PREPROCESSOR_DEFINITIONS//*SANDBOX_ENV=/}" 
# remove everything after our value from TMPVAL and return it 
TMPVAL="${TMPVAL// */}" 
echo $TMPVAL; #outputs 1 

HTH,

bovako

+1

會試試這個... – 2014-12-11 10:10:39

+1

不錯的一個!任何參考我可以在哪裏閱讀更多關於bash「$ {...}'及其與'//'運算符的用法? – adib 2015-10-28 06:42:37

+1

man bash :) @adib 在手冊頁中,搜索「Parameter Expansion」以獲得正確的部分; $ {parameter/pattern/string} 模式替換。該模式擴大產生一個拍打... – 2015-11-05 11:27:55

3

您應該能夠使用awk或一些簡單地分析它,但在這裏就是我會做它:

echo $GCC_PREPROCESSOR_DEFINITIONS | grep -Po 'SANDBOX_ENV=\d+' | sed 's/SANDBOX_ENV=//' 

在您的迴音方面:

echo "SANDBOX value is $(echo $GCC_PREPROCESSOR_DEFINITIONS | grep -Po 'SANDBOX_ENV=\d+' | sed 's/SANDBOX_ENV=//')" 

我基本上管道GCC_PREPROCESSOR_DEFINITIONS的內容和grepped的SANDBOX_ENV部分。

grep -P 

是使用Perl正則表達式\ d +,因爲我不喜歡POSIX。只是一個偏好。本質上講

grep -P 'SANDBOX_ENV=\d+' 

確實是找到了內容的行管道輸送到一個包含字符串「SANDBOX_ENV =」和任何其後面的位數。如果該值可能包含字母,數字,您可以更改\ d的數字來\ W一個字,其包括A-ZA-Z0-9,你會得到:

grep -Po 'SANDBOX_ENV=\w+' 

的+只是意味着必須有至少一個字符由它前面的字符指定的類型,包括所有匹配的後續字符。

在grep的-Po的-o(僅匹配)被用來隔離比賽,這樣,而不是整個行,你剛剛獲得「SANDBOX_ENV = 1」。

然後將此輸出傳送到sed命令,我在其中執行簡單查找並替換將「SANDBOX_ENV =」替換爲「」的位置,只留下後面的值。使用awk可能有更簡單的方法,但你必須自己學習。

+0

這裏沒有必要的perl模式。 ''SANDBOX_ENV = [[:digit:]] \ +''將在沒有它的情況下工作。 – 2014-12-11 02:17:18

+0

這是我提到的POSIX標準,我不喜歡。但隨意使用它。 :)實際上,要替換\ w你可以使用[[:alnum:]]。 – alienchow 2014-12-11 06:20:52

+0

哦,並注意Perl模式正則表達式\ w包含下劃線'_'。 – alienchow 2014-12-11 06:43:10

1

可能是明顯的答案,但你只是嘗試:

echo ${SANDBOX_ENV} 

如果還是不行,請嘗試使用eval:

eval "${GCC_PREPROCESSOR_DEFINITIONS}" 
echo ${SANDBOX_ENV} 
+1

除非'GCC_PREPROCESSOR_DEFINITIONS'的值保證是安全的,否則這是潛在的危險。 – 2014-12-11 02:14:03

+0

這在預處理器宏的情況下不起作用。 – 2014-12-11 10:10:13

2

如果你想擁有自己的東西包含在生成設置,您不介意輕微間接,然後:

  1. 創建用戶定義的設置SANDBOX_ENV=1 (或任何你想要的值)
  2. 在預處理宏,添加SANDBOX_ENV=${SANDBOX_ENV}

在您的外殼,測試,做

echo ${SANDBOX_ENV} 

與用戶定義的設置,你仍然可以修改構建配置和體系結構的值。因此,例如,您可以使Debug配置爲SANDBOX_ENV = 0,Release爲SANDBOX_ENV = 1。

enter image description here