plist文件并非直接的代码,不能通过shell脚本直接对其操作,需要使用Macos的PlistBuddy,本文主要描述PlistBuddy在plist文件中具体对象的增删改查四种操作:
引用
而Macos并未在环境变量中默认配置PlistBuddy,所以需要通过绝对路径来引用:
/usr/libexec/PlistBuddy
前文已经说过一个重点:【plist文件并非直接的代码,不能通过shell脚本直接对其操作】,所以我们对plist中读取出来的对象,是无法按照shell中的容器类型的语法进行操作的,例如我们对一个dict进行操作,不能通过dict[key]的形式取出value,而是需要通过PlistBuddy的语法来操作。
所以此处我先对plist中两种容器dict和array的操作,进行描述,然后在后面的各种操作中才便于说明:
查
输出或打印语法如下:
/usr/libexec/PlistBuddy -c 'Print :'$key'' info.plist
所以查询语句如下:
value=/usr/libexec/PlistBuddy -c 'Print :'$key'' info.plist
但这种形式只能查询到到基本数据类型,对于dict和array中的元素的查找,需要注意:上面查询到结果value如果是dict和array,是无法对容器内具体元素处理的,因为PlistBuddy没有语句对dict和array进行进一步处理,当然也无法通过shell语法对输出的value通过PlistBuddy的语法来操作。
所以对于容器中元素需要特殊处理:
对于dict中的元素,只需要在key中将dict中想要元素的key1也拼接在key后面即可,如下所示:
key="key:key1"
value=/usr/libexec/PlistBuddy -c 'Print :'$key'' info.plist
对于array中的元素,只需要在key中将array中想要元素的索引也拼接在key后面即可,如下所示:
key="key:0" #取array中第一个元素,索引为0
value=/usr/libexec/PlistBuddy -c 'Print :'$key'' info.plist
删
删除语法如下:
/usr/libexec/PlistBuddy -c 'Delete :$key' info.plist
对于dict和array中的元素的删除,参照“查”中对key的拼接来删除容器内具体元素。
改
修改元素语法如下:
/usr/libexec/PlistBuddy -c 'Set :$key string "value" ' info.plist
对于dict和array中的元素的修改,参照“查”中对key的拼接来修改容器内具体元素。
增加普通元素
增加普通元素语法如下:
/usr/libexec/PlistBuddy -c 'Add :$key string "value"' info.plist
增加数组元素
对于array中元素,需要首先考虑已经存在此数组,
- 对于已经存在array的情况:
key="key:2"
/usr/libexec/PlistBuddy -c 'Add :$key string "value"' info.plist
但注意:如果直接使用上面的操作,会将元素插入索引为2这个位置,如果此位置已经有元素,将会替换掉。如果不想替换,就需要首先确定数组元素的索引,如果我们需要将元素添加到数组最后,就需要判断当前数组中已经存在元素的个数。PlistBuddy没有支持获取数组元素个数的语法,我们自己探索一下:我们可以看到Array的形式如下:
Array {
WEBRTC_POSIX
WEBRTC_MAC
}
所以判断个数,可以通过PlistBuddy+shell完成,首先通过PlistBuddy的查询获取到数组,输出字符串到一个变量,然后判断字符串中 { } 中间元素的个数,因为元素是通过换行来间隔的,所以通过判断换行来确定个数。
- 对于还没有array的情况:需要首先添加array,然后再向其中添加元素。
# 添加数组的key,Arraykey
/usr/libexec/PlistBuddy -c 'Add :$Arraykey array' info.plist
# 依次添加两个value值
/usr/libexec/PlistBuddy -c 'Add :$Arraykey: string value1' info.plist
/usr/libexec/PlistBuddy -c 'Add :$Arraykey: string value2' info.plist
增加字典元素
# 如果还不存在字典,则先添加字典容器:添加dict的key值 dictkey
/usr/libexec/PlistBuddy -c 'Add :$dictkey dict' info.plist
# 添加key:value对,如果已经存在字典,不需要经过上一步
/usr/libexec/PlistBuddy -c 'Add :$dictkey:key string value' info.plist
【】注意【】:
PlistBuddy对xcode的工程文件进行处理之后,虽然工程文件中未修改的内容没有变化,但将导致工程文件的内容排列位置形式变化很大,对应于我们的版本管理软件,svn或git,通常显示整个文件都变化了。但是对工程的使用不产生影响。