我有一个棘手的问题。我尝试将一些过程参数映射到Ruby中的哈希映射。我想比较参数(第一个示例)和配置文件(例如json-第二个示例)中的流程配置。
我有这样的东西:
/usr/bin/dockerd-current \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--seccomp-profile=/etc/docker/seccomp.json \
--selinux-enabled \
--storage-driver overlay2
我想要一个像这样的哈希图:
{
'add-runtime' => {
'docker-runc' => '/usr/libexec/docker/docker-runc-current'
},
'seccomp-profile' => '/etc/docker/seccomp.json',
'selinux-enabled' => '',
'storage-driver' => 'overlay2'
}
编辑: 我制作了一个脚本,该脚本通常将参数映射到哈希图中。问题在于,该脚本无法正确检测和映射嵌套元素。这是我所拥有的:
params = "/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2"
args = params.split("--")
# Remove process binary from args.
args.shift
# Remove multiple whitespaces and replace equals sign with single whitespace.
args.map! { |item| item.split.join(" ") }
args.map! { |item| item=item.gsub('=',' ') }
# Single word params implicit boolean flags with value true
# Adding true here.
args.map! do |item|
if item.split(" ").size == 1
item+" true"
else
item
end
end
# Map results to hashmap.
# TODO: substructures are not mapped properly...
args.map! do |x|
s = x.split(" ", 2)
[s[0], s[1]]
end
puts args.to_h
我很高兴能提供任何帮助。
非常感谢!
答案 0 :(得分:0)
如评论中所建议,https://docs.ruby-lang.org/en/2.1.0/OptionParser.html是必经之路。
建立您的选项哈希,然后(如果有的话,http://api.rubyonrails.org/v2.3/classes/ActiveSupport/CoreExtensions/Hash/Diff.html)对它们进行积极的支持,或者如果可能的话,将它们与hashdiff gem进行比较。如果所有其他方法均失败,则可以检查与右侧相比左侧的键,反之亦然。