如果我有一个Adhoc.xcconfig
,我定义了一个变量:
PREPROCESSOR_DEFINITIONS = IS_ADHOC=1 CRASHLYTICS=1
在运行脚本中,有一个类似于以下的检查:
if [ "${PREPROCESSOR_DEFINTIONS/CRASHLYTICS=1}" = "$PREPROCESSOR_DEFINITIONS" ] ; then
echo "Crashlytics is disabled, skipping Crashlytics dSYM upload"
else
echo "Crashlytics is on"
end
if语句检查是什么?我不清楚/
是否特定于bash或xcconfig的语法。令人困惑的是,if语句使用=
而不是==
来检查作业的结果。
逐段分解if语句:
"${PREPROCESSOR_DEFINITIONS}/CRASHLYTICS=1}"
- 是一个变量扩展。
/
- 是否将较大的变量PREPROCESSOR_DEFINTIONS
编入索引以检查CRASHLYTICS
变量是否存在?
= "$PREPROCESSOR_DEFINITIONS"
- 这只是将此字符串文字分配给前一个表达式的结果吗?
任何可以阐明该语法以及if语句试图完成的内容的人都会很棒。
答案 0 :(得分:1)
这完全是关于bash
,而不是xcconfig文件。 xcconfig
文件仅建立构建设置。默认情况下,构建设置将作为环境变量导出到运行脚本构建阶段。这是两者之间的唯一关系。 xcconfig文件的格式仅在读取xcconfig文件时才有意义。
从参数扩展的bash
手册页部分:
$ {参数/模式/字符串}
扩展模式以生成模式,就像在路径名扩展中一样。 参数已展开, pattern 与其值的最长匹配将替换为 string 。 [...]如果 string 为null,则删除 pattern 的匹配项,并且可以省略/ follow pattern 。 [...]
因此,"${PREPROCESSOR_DEFINTIONS/CRASHLYTICS=1}"
展开PREPROCESSOR_DEFINTIONS
,但会从结果字符串中删除CRASHLYTICS=1
的所有实例。
单=
不是作业。这是等于比较。 Bash也支持==
但是,正如手册页所说:
=
可用于代替==
以严格遵守POSIX。
因此,从技术上讲,=
更为标准。
因此,if
正在测试PREPROCESSOR_DEFINTIONS
是否包含 CRASHLYTICS=1
。如果确实包含它,则删除CRASHLYTICS=1
的扩展将不等于未修改的扩展。
当然,鉴于echo
的每个分支中的if
语句,这是有道理的。