如果我有一个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如果语句检查的话会怎么样?我不清楚/是特定于bash还是xcconfig的语法。同样令人困惑的是,if语句正在使用=而不是==检查赋值的结果。
将if语句一片片地分解:
"${PREPROCESSOR_DEFINITIONS}/CRASHLYTICS=1}" -是一个可变的扩展。/ -这个索引是更大的变量,PREPROCESSOR_DEFINTIONS来检查CRASHLYTICS变量的存在吗?= "$PREPROCESSOR_DEFINITIONS" --这仅仅是将这个字符串文本分配给前一个表达式的结果吗?任何能够解释这个语法的人,以及if语句试图实现的目标,都会很棒。
发布于 2017-02-25 03:24:33
这都是关于bash的,而不是xcconfig文件。xcconfig文件只建立一个生成设置。默认情况下,生成设置作为环境变量导出到运行脚本生成阶段。这是两者之间唯一的关系。只有在读取xcconfig文件时,xcconfig文件的格式才是相关的。
来自bash手册页关于参数展开的部分:
${参数/模式/字符串} 模式被展开以产生一个模式,就像在路径名称展开中一样。参数进行扩展,并将模式与其值的最长匹配替换为string。…如果字符串为null,则删除模式匹配,可以省略/后续模式。…
因此,"${PREPROCESSOR_DEFINTIONS/CRASHLYTICS=1}"扩展PREPROCESSOR_DEFINTIONS,但从结果字符串中删除CRASHLYTICS=1的所有实例。
单个=不是赋值。这是相等的比较。Bash也支持==,但是,如手册页所述:
为了严格遵守POSIX,可以使用
=代替==。
因此,从技术上讲,=是更标准的。
因此,if正在测试PREPROCESSOR_DEFINTIONS 是否包含 CRASHLYTICS=1。如果它包含它,那么删除CRASHLYTICS=1的扩展将不等于未修改的扩展。
当然,考虑到echo语句在if的每个分支中,这是有意义的。
https://stackoverflow.com/questions/42449896
复制相似问题