【问题标题】:Get specific value of preprocessor macro获取预处理器宏的具体值
【发布时间】:2015-02-03 10:01:03
【问题描述】:

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

SANDBOX_ENV=1

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

我试过回显"SANDBOX value is = ${GCC_PREPROCESSOR_DEFINITIONS}"

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

我想使用分配给 SANDBOX_ENV 的值

【问题讨论】:

  • 你能解析 ${GCC_PREPROCESSOR_DEFINITIONS} 的字面值吗?您可以将文字值作为 shell 脚本中的命令执行。然后,相应的 shell 环境变量将被设置为这些值。 (不记得语法了...)
  • 我不知道 shell 脚本。将尝试搜索命令。

标签: ios xcode shell macros preprocessor


【解决方案1】:

试试这个:

#!/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,

博瓦科

【讨论】:

  • 不错的一个!我可以在哪里阅读更多关于 bash 的 ${...} 及其与 // 运算符的使用的任何参考资料?
  • man bash :) @adib 在手册页中,搜索“参数扩展”以找到正确的部分; ${parameter/pattern/string} 模式替换。该模式被扩展以产生一个模式......
  • 如果它有效@mihirmehta 请将其标记为答案 =) 我的分数可以使用它
【解决方案2】:

您应该能够使用 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 的内容并找出 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 可能有更简单的方法,但您必须自己学习。

【讨论】:

  • 这里不需要perl模式。 'SANDBOX_ENV=[[:digit:]]\+' 没有它也可以工作。
  • 这就是我提到的我不喜欢的 POSIX 标准。但请随意使用它。 :) 实际上,要替换 \w 您可以使用 [[:alnum:]]。
  • 哦,注意 Perl 模式正则表达式 \w 包含下划线 '_'。
【解决方案3】:

可能是显而易见的答案,但您是否尝试过:

echo ${SANDBOX_ENV}

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

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

【讨论】:

  • 这有潜在的危险,除非GCC_PREPROCESSOR_DEFINITIONS 的值保证是安全的。
【解决方案4】:

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

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

在你的shell中,进行测试,做

echo ${SANDBOX_ENV}

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

【讨论】:

    猜你喜欢
    • 2019-03-18
    • 1970-01-01
    • 2015-04-15
    • 2015-07-31
    • 1970-01-01
    • 2010-09-19
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多