Bash 如何使用命令替换使用PlistBuddy

Bash 如何使用命令替换使用PlistBuddy,bash,shell,plistbuddy,Bash,Shell,Plistbuddy,我正在尝试下面的脚本 #!/bin/bash OUTPUT="$(cat /Users/admin/Desktop/plist-script-output/keys-updated.txt | sed 's/"//g; s/^/-c "Print :/g; s/$/"/g' | tr '\n' ' ')" FILE="/Users/admin/Desktop/plist-script-output/plist-data/data.plist" PLISTBUDDY=$(/usr/libex

我正在尝试下面的脚本

#!/bin/bash

OUTPUT="$(cat /Users/admin/Desktop/plist-script-output/keys-updated.txt | sed 's/"//g; s/^/-c "Print :/g; s/$/"/g' | tr '\n' ' ')"

FILE="/Users/admin/Desktop/plist-script-output/plist-data/data.plist"

PLISTBUDDY=$(/usr/libexec/PlistBuddy $OUTPUT $FILE 2>&1)
echo "$PLISTBUDDY"
上述脚本的输出是无法识别的命令

输出变量的值为

-c“打印:蚂蚁转换”-c“打印:新项目”-c“打印:区域”-c“打印:联系人”

2>&1这是为了打印错误(不存在键)和正确的输出而添加的

keys updated.txt包含要从plist文件中提取的密钥列表(不一定所有密钥都存在于plist中)

解决方案(不起作用) 尝试了@Nahuel的解决方案。然而这条线

PLISTBUDDY=$(评估集--$OUTPUT;/usr/libexec/PLISTBUDDY“$@”“$FILE”)

仅提供plist中不存在的键的列表

这是我在使用@Nahuel的解决方案后收到的输出

打印:条目“状态”不存在

打印:条目“通知”不存在

打印:条目“IsMvnMgrSupported”不存在

打印:条目“BuildsetFile”不存在

打印:条目“RollupClocReportToModule”不存在

打印:条目“分支”不存在

打印:条目“Ant Conversion”不存在

打印:条目“IndexTag”不存在

打印:条目“WO”不存在

打印:条目“标签”不存在

打印:条目“Newitem”不存在

关于直接在命令行上使用命令

管理员:桌面管理员$/usr/libexec/PlistBuddy-c“打印:区域”-c“打印:联系人”-c“打印:电子邮件”-c“打印:语言”-c“打印:位置”-c“打印:名称”-c“打印:注释”-c“打印:目的”-c“打印:跟踪”-c“打印:类型”-c“打印:URL”-c“打印:状态”-c“打印:通知”-c“打印:受支持”-c“打印:构建集文件”-c“打印:RollupClocReportToModule”-c“打印:分支”-c“打印:蚂蚁转换”-c“打印:索引”-c“打印:WO”-c“打印:标签”-c“打印:新项”/Users/admin/Desktop/plist脚本输出/plist数据/ActiveMQ.plist

输出结果是

监控。 库丘纽恩。 疾病预防控制中心。 JAVA dvfv。 ActiveMQ。 CDDCDC。 一个来自Apache软件基金会的消息传递(JMS)框架。 基础设施 框架 jdbcjdbcjdcnnjn。 打印:条目“:状态”不存在。 打印:条目“:Notify”不存在。 打印:条目“:IsMvnMgrSupported”不存在。 打印:条目“:BuildsetFile”不存在。 打印:条目“:RollupClocReportToModule”不存在。 打印:条目“:分支”不存在。 打印:条目“:Ant Conversion”不存在。 打印:条目“:IndexTag”不存在。 打印:条目“:WO”不存在。 打印:条目“:标记”不存在。 打印:条目“:Newitem”不存在。
中止陷阱:6

查看sed和tr命令后。似乎/Users/admin/Desktop/plist script output/keys-updated.txt包含

Ant-Conversion
Newitem
Area
Contact
整个过程可以通过bash内置来完成:

# local args arr pcmd (if inside a function)
# readarray -t arr </Users/admin/Desktop/plist-script-output/keys-updated.txt
# because readarray doesn't work on Mac
IFS=$'\n' read -d '' arr </Users/admin/Desktop/plist-script-output/keys-updated.txt

args=()
for pcmd in "${arr[@]}"; do
    args+=(-c "Print :$pcmd")
done

PLISTBUDDY=$(/usr/libexec/PlistBuddy "${args[@]}" "$FILE" 2>&1)
引号不是语法性的,因为引号处理是在变量展开之前完成的

不安全(注射),在本例中使用eval

PLISTBUDDY=$(eval /usr/libexec/PlistBuddy $OUTPUT $FILE 2>&1)
暂时想不出更好的办法

稍微好一点

PLISTBUDDY=$(eval set -- $OUTPUT;/usr/libexec/PlistBuddy "$@" "$FILE" 2>&1)

感谢Nahuel Fouilleul提供解决方案。但是,PLISTBUDDY=$(评估集--$OUTPUT;/usr/libexec/PLISTBUDDY“$@”“$FILE”2>&1)仅打印plist文件中不存在的键。我希望输出包含所有键的结果,而不是根据上述解决方案仅打印plist中不存在的键。我没有收到plist中存在的键的输出。输出仅包含“不存在”列表“钥匙。您能否帮助@Nahuel Fouilleult这一次我的输出变量包含以下ReadArray在MacOSX上不工作。。。。谢谢你的解决方案。。你能提供任何其他可以在Mac上使用的代码片段吗?答案是用bash解决问题,其他问题来自PlistBuddy
PLISTBUDDY=$(eval set -- $OUTPUT;/usr/libexec/PlistBuddy "$@" "$FILE" 2>&1)