![如何从脚本中的 gsettings 数组中删除元素?](https://linux22.com/image/1102020/%E5%A6%82%E4%BD%95%E4%BB%8E%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%20gsettings%20%E6%95%B0%E7%BB%84%E4%B8%AD%E5%88%A0%E9%99%A4%E5%85%83%E7%B4%A0%EF%BC%9F.png)
dbus/gsettings 中的数组具有格式[element1, element2, element3, ...]
。
Gsettings
' 接口只允许用另一个数组替换现有数组,因此例如,添加另一个项目元素可以按如下方式实现:
#!/bin/bash
gsettings get ${schema} ${key} | grep -q \"${value}\" >/dev/null
if [ $? -ne 0 ]; then
gsettings set ${schema} ${key} \"`gsettings get ${schema} ${key} | sed s/.$//`, ${value}]\"
fi
有人能帮我编写一个脚本吗,该脚本检查是否至少存在一个与正则表达式匹配的元素,如果存在,它会解析 gsettings array string, and removes all matching elements (and puts it back with
gsettings 集,但这很简单)。
我试图寻找这样的工具,但没找到。我不敢相信,竟然没有人需要这样的工具……
答案1
使用 bash 完成这个任务应该是可能的,但我更喜欢使用 Python3 脚本进行复杂的数组操作:
#!/usr/bin/env python3
import argparse
import subprocess
import sys
parser = argparse.ArgumentParser()
parser.add_argument("schema", help="gsettings shema", metavar="SCHEMA")
parser.add_argument("key", help="gsettings key", metavar="KEY")
parser.add_argument("values",
help="gsettings value(s) to remove from the KEY array",
metavar="VALUE", nargs='*')
args = parser.parse_args()
array = eval(subprocess.check_output(["gsettings", "get", args.schema, args.key]))
for v in args.values:
try:
value = eval(v)
except:
value = v
try:
array.remove(value)
except ValueError:
print("Warning: {} not in {} {}".format(value, args.schema, args.key), file=sys.stderr)
subprocess.call(["gsettings", "set", args.schema, args.key, str(array)])
该脚本允许同时从传递给脚本的模式/键中删除多个值。