获取预处理器宏的特定值

时间:2014-12-05 09:14:30

标签: ios xcode shell macros preprocessor

在我的构建设置中,我定义了一些预处理器宏

即。的 SANDBOX_ENV = 1

我想在shell脚本中使用SANDBOX_ENV的值。

我尝试过echo "SANDBOX value is = ${GCC_PREPROCESSOR_DEFINITIONS}"

但它给了我所有的宏值,如DEBUG=1 SANDBOX_ENV=1 COCOAPODS=1

我想使用分配给SANDBOX_ENV的值

4 个答案:

答案 0 :(得分:7)

试试这个:

#!/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 :(得分:3)

您应该可以使用awk或其他东西轻松解析它,但这就是我的方法:

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

在你的echo环境中:

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

基本上我用管道传输了GCC_PREPROCESSOR_DEFINITIONS的内容并且插入了SANDBOX_ENV部分。

grep -P 

是使用Perl正则表达式\ d +,因为我不喜欢POSIX。只是一个偏好。基本上是什么

grep -P 'SANDBOX_ENV=\d+' 

的目的是找到包含字符串“SANDBOX_ENV =”及其后续任意位数的内容管道中的行。如果该值可能包含字母数字,您可以将数字的\ d更改为包含a-zA-Z0-9的单词的\ w,然后得到:

grep -Po 'SANDBOX_ENV=\w+'

+只表示必须至少有一个由前面的字符指定的类型的字符,包括匹配的所有后续字符。

grep -Po中的-o(仅匹配)用于隔离匹配,这样您只需获得“SANDBOX_ENV = 1”而不是整行。

然后将此输出传送到sed命令,在那里我进行简单的查找和替换,将“SANDBOX_ENV =”替换为“”,只留下它后面的值。可能更容易用awk做这个,但你必须自己学习。

答案 2 :(得分:2)

如果您想在构建设置中包含一些自包含的东西,并且您不介意轻微间接,那么:

  1. 创建用户定义的设置SANDBOX_ENV=1(或您想要的任何值)
  2. 在预处理器宏中,添加SANDBOX_ENV=${SANDBOX_ENV}
  3. 在你的shell中,要进行测试,请执行

    echo ${SANDBOX_ENV}
    

    使用用户定义的设置,您仍然可以修改构建配置和体系结构的值。因此,例如,您可以使Debug配置为SANDBOX_ENV = 0,Release为SANDBOX_ENV = 1.

    enter image description here

答案 3 :(得分:1)

可能是明显的答案,但你只是尝试过:

echo ${SANDBOX_ENV}

如果这不起作用,请尝试使用eval:

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