我有以下命令返回一个多行字符串,我想将它放入一个数组并迭代它,每行作为一个单独的元素。
def get_mnt_pts
`grep VolGroup /proc/self/mounts | awk '{print $2, $4}' | awk -F, '{print $1}' | awk '{print $1, $2}'`
end
命令返回的数据,是分组
之前数组的原始输入/ rw
/home rw
/usr rw
/tmp rw
/var rw
/var/log rw
我有以下代码,它看起来像是采用该数据并将其拆分为换行符并将其放入数组中。然后我调用数组上的长度来确认,我可以拉出N值,但是当我执行array.each时它只能获取第一个值。
我有一种感觉,我将整个字符串作为单个元素转储,但然后.length返回我认为应该的东西。我已经查看了关于数组的Ruby文档以及字符串,看看我是否可以解决它。我相当肯定我正在创建错误的数组,但不确定如何。
mount_info = Array.new
mount_info = get_mnt_pts.split("\n")
puts mount_info.length #this returns 6
mount_info.each do |pt|
puts pt #only puts the first value of / rw
end
当我打印出mount_info本身时,我得到以下内容
print mount_info
["/ rw", "/home rw", "/usr rw", "/tmp rw", "/var rw", "/var/log rw"]
puts mount_info
/ rw
/home rw
/usr rw
/tmp rw
/var rw
/var/log rw
print mount_info[4] #returns back /var rw
puts mount_info[4] #returns back /var rw
不知道从哪里看,任何方向都会很棒。最终结果是,对于数组中的每个元素,我想尝试在该目录中编写一个文件,以确认文件系统实际上是可写的。该数组包含一个挂载点列表,对于每个挂载点,我将编写一个Tempfile,这样下面的块将接收数组并迭代它。
def is_rw_test(mount_info)
mount_info.each do |pt|
Dir.exist? pt.split[0] || @crit_pt_test << "#{ pt.split[0] }"
file = Tempfile.new('.sensu', pt.split[0])
puts "The temp file we are writing to is: #{ file.path }" if config[:debug]
file.write("mops") || @crit_pt_test << "#{ pt.split[0] }"
file.read || @crit_pt_test << "#{ pt.split[0] }"
file.close
file.unlink
return @crit_pt_test
end
end
代码工作正常,但只针对数组中的第一个元素,但它不会为每个元素执行此操作,这就是为什么我认为我的数组赋值是borked。
由于
答案 0 :(得分:1)
def is_rw_test(mount_info)
mount_info.each do |pt|
Dir.exist? pt.split[0] || @crit_pt_test << "#{ pt.split[0] }"
# Etc
return @crit_pt_test # ohai
end
end
你有一个return
,所以它会返回,而不再通过each
进行迭代。
如果您想收集值,请执行以下操作:
def is_rw_test(mount_info)
mount_info.collect do |pt|
Dir.exist? pt.split[0] || @crit_pt_test << "#{ pt.split[0] }"
# Etc
@crit_pt_test
end
end
但如果是这种情况,则实例变量没有任何意义。
您需要决定实际想要做什么。