Ruby-存储在数组中并返回所有值

时间:2018-07-17 12:19:45

标签: arrays ruby linux

所以我有一个带有这种输出的shell命令:

sqoop-client - 2.6.4.0-91
sqoop-server - 2.6.4.0-91
storm-slider-client - 2.6.4.0-91
tez-client - 2.6.4.0-91
zookeeper-client - 2.6.4.0-91
zookeeper-server - 2.6.4.0-91

我想将此输出(服务名称和服务版本)存储在一个数组中,然后返回所有对象。

此刻,在我的代码中,我已经返回了一些固定值,如:

#code :

 return {
   hdp_version: Facter::Core::Execution.execute('/usr/bin/hdp-select versions | tail -1'),
   sqoop: File.exist?('/etc/sqoop'),
 }

#output :
{
  hdp_version => "2.6.4.0-91",
  sqoop => false
}

如何将shell命令的输出存储在2D数组中,并像上面的示例一样解析所有值以返回它们?

像这样(但循环):

obj[0][0] : obj[0][1], 
obj[1][0] : obj[1][1],
[...]

谢谢

1 个答案:

答案 0 :(得分:2)

考虑到您有这样的输出,您只需要迭代输出中的每一行,用" - "拆分该行并将其存储在结果哈希中:

libs = "sqoop-client - 2.6.4.0-91\n" \
"sqoop-server - 2.6.4.0-91\n" \
"storm-slider-client - 2.6.4.0-91\n" \
"tez-client - 2.6.4.0-91\n" \
"zookeeper-client - 2.6.4.0-91\n" \
"zookeeper-server - 2.6.4.0-91\n"

libs_with_versions = libs.each_line.with_object({}) do |line, result|
  lib, version = line.strip.split(" - ")
  result[lib] = version
end

puts libs_with_versions

返回:

{
   "sqoop-client" => "2.6.4.0-91",
   "sqoop-server" => "2.6.4.0-91",
   "storm-slider-client" => "2.6.4.0-91",
   "tez-client" => "2.6.4.0-91",
   "zookeeper-client" => "2.6.4.0-91",
   "zookeeper-server"=>"2.6.4.0-91"
}