通过匹配键从xcconfig更新Info.plist字符串的脚本实现问题
解决从xcconfig更新Info.plist键值的问题
我看到你尝试用awk结合PlistBuddy实现从xcconfig配置文件更新Info.plist的对应字符串,但原命令的逻辑和语法存在几个问题,导致无法正确工作。咱们一步步来修正:
原代码的问题分析
- 你在awk里错误使用了
$(rlwrap ...)这种子shell写法,awk中调用外部命令应该用system()函数 - 变量
i和QADIC[i]没有正确传递给PlistBuddy命令,awk变量需要通过字符串拼接的方式传递到外部命令中 - 其实不需要额外做键匹配判断:PlistBuddy的
Set命令会自动处理键存在则更新,不存在则创建的逻辑,刚好契合你的需求
正确的实现命令
下面这个awk命令可以完美实现你的需求:
awk -F= ' FNR==NR { # 读取xcconfig文件,构建键值对字典 key = $1 # 处理值中可能包含等号的情况(更通用的写法,获取等号后所有内容) value = substr($0, index($0, "=")+1) QADIC[key] = value next } END { # 遍历字典,调用PlistBuddy更新Info.plist for (k in QADIC) { cmd = "/usr/libexec/PlistBuddy -c \"Set :" k " " QADIC[k] "\" Info.plist" system(cmd) } } ' qa.xcconfig
执行效果
执行完上面的命令后,你的Info.plist会被更新为:
<key>username</key> <string>newUserName</string> <key>password</key> <string>newPassword</string>
补充说明
- 如果你的xcconfig里的值包含空格或特殊字符,这个命令也能正常处理,因为我们用
substr获取了等号后面的所有内容,并且用双引号包裹了PlistBuddy的命令参数 - 如果你只想更新已经存在的键,可以先通过PlistBuddy的
Print命令检查键是否存在,再执行Set,修改循环部分如下:
for (k in QADIC) { # 先检查键是否存在,不存在则跳过 check_cmd = "/usr/libexec/PlistBuddy -c \"Print :" k "\" Info.plist >/dev/null 2>&1" if (system(check_cmd) == 0) { set_cmd = "/usr/libexec/PlistBuddy -c \"Set :" k " " QADIC[k] "\" Info.plist" system(set_cmd) } }
内容的提问来源于stack exchange,提问作者Sami
相关产品推荐
相关产品推荐

