You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过匹配键从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:46:39