AppleScript调用defaults write存储字符串数组报错如何解决
问题原因
defaults write命令本身原生支持存储字符串数组,不存在功能层面的限制。- 报错核心是AppleScript的
do shell script转义解析规则和终端交互式shell不一致:代码中写的\"转义双引号,经过AppleScript解析后传递给shell时,没有被识别为参数边界包裹符,导致shell拆分参数的结果不符合defaults命令的语法要求,最终判定abcd为非法额外参数,终止写入操作。
正确实现方案
以下三种写法都可以正常完成字符串数组的存储,根据实际业务场景选择即可:
方案1:单引号包裹元素(最简单,推荐无特殊字符场景使用)
单引号在do shell script传递链路中不需要额外转义,会被shell直接识别为字符串边界,写法最简洁,适合数组元素不含单引号的场景:
do shell script "defaults write com.subdomain.xyz -array 'abc' 'abcd' 'abcde'"
执行后通过defaults read com.subdomain.xyz可验证写入结果:
( abc, abcd, abcde )
方案2:双引号多层转义(适合元素含单引号的场景)
如果数组元素本身包含单引号,需要用双引号包裹元素,此时需要对双引号做两层转义(分别适配AppleScript、shell的解析规则):
-- 示例中第三个元素包含单引号 do shell script "defaults write com.subdomain.xyz -array \\\"abc\\\" \\\"abcd\\\" \\\"it's test value\\\""
方案3:逐元素追加(适合动态数组场景)
如果数组元素是动态拼接生成的,可以先初始化空数组,再逐元素追加内容,每个元素单独处理转义,大幅降低转义出错概率:
-- 初始化根节点为空数组,若要写入指定键,在-array前添加键名即可,例如 do shell script "defaults write com.subdomain.xyz 'configList' -array" do shell script "defaults write com.subdomain.xyz -array" -- 逐元素追加数组项 do shell script "defaults write com.subdomain.xyz -array-add 'abc'" do shell script "defaults write com.subdomain.xyz -array-add 'abcd'" do shell script "defaults write com.subdomain.xyz -array-add 'abcde'"
补充说明:如果不需要将整个plist文件的根节点设为数组,而是要给plist内的指定key设置数组值,只需要在
-array参数前加上对应的键名即可,示例:do shell script "defaults write com.subdomain.xyz 'customListKey' -array 'abc' 'abcd' 'abcde'"
内容的提问来源于stack exchange,提问作者user4150758
相关产品推荐
相关产品推荐

