处理空值与JSON返回
问题描述:
我运行红宝石1.9。我有这个代码,它是从这两个/usr/sbin/storcli /c0/bbu show j
& /usr/sbin/storcli /c0/cv show j
命令中提取出Status
和State
的值。处理空值与JSON返回
#!/usr/bin/ruby
require 'json'
output_bbu = %x{/usr/sbin/storcli /c0/bbu show j}
output_cv = %x{/usr/sbin/storcli /c0/cv show j}
begin
j = JSON.parse(output_bbu)
k = JSON.parse(output_cv)
result = j["Controllers"][0]["Command Status"]["Status"]
### I'm not sure how to get the value of "State" and store it in "status" variable.
status = k["Controllers"][0]["Response Data"]["Cachevault_Info"][0]["State"]
status = j["Controllers"][0]["Response Data"]["BBU_Info"][0]["State"]
###
rescue Exception => e
puts "CRITICAL: error reading BBU status: #{e}"
exit 2
end
if result != 'Success'
puts "CRITICAL: command not successful, result: #{result}"
exit 2
end
问题:
其中两个命令storcli /c0/cv show j
或storcli /c0/bbu show j
在 “状态” 返回空值的变量和脚本失败,错误
未定义的方法`[]”为无:NilClass
storcli /c0/cv show j
co uld返回“State”的零值或storcli /c0/bbu show j
可返回零。所以我想要做的是将“状态”的值存储在变量“状态”中。命令
示例输出,
$ storcli /c0/cv show j
{
"Controllers":[
{
"Command Status" : {
"Controller" : 0,
"Status" : "Success",
"Description" : "None"
},
"Response Data" : {
"Cachevault_Info" : [
{
"Model" : "CVPM02",
"State" : "Optimal",
"Temp" : "35C",
"Mode" : "-",
"MfgDate" : "2013/09/17"
}
]
}
}
]
}
看,这里它返回“状态”为“最佳”的价值,所以我想它的值存储在变量“的地位。”
零的示例输出,
$ storcli /c0/bbu show j
{
"Controllers":[
{
"Command Status" : {
"Controller" : 0,
"Status" : "Failure",
"Description" : "None",
"Detailed Status" : [
{
"Ctrl" : 0,
"Status" : "Failed",
"Property" : "-",
"ErrMsg" : "use /cx/cv",
"ErrCd" : 1001
}
]
}
}
]
}
答
既然你不是从一个命令得到一个“响应数据”,您可以使用下面的
status = k["Controllers"][0]
.fetch(["Response Data"], {})
.fetch(["Cachevault_Info"], {})
.fetch([0], {})["Status"]
status ||= j["Controllers"][0]["Response Data"]["BBU_Info"][0]["State"]
随着||=
,如果结果from status = k
是nil
它会设置为status = j
我只关心'State'的值而不管命令。不是“详细状态”中的“状态”。 – Rahul
如果没有来自bbu的“状态”,那么使用'storcli/c0/cv show j'命令并将该值存储在“状态” – Rahul
感谢您的更新,但我仍然得到'CRITICAL:读取BBU状态时出错:未定义的方法[]为零:NilClass' – Rahul