嗨,我的 Json 檔案如下:
{
"num_sensor" : 1,
"J2" : {"B" : "sensor0", "A" : "sensor1", "D" : "sensor2" , "C" : "sensor3"},
"J1" : {"B" : "", "A" : "sensor5", "D" : "sensor6" , "C" : "sensor7"}
}
我嘗試了以下方法來檢查 J1.B 是否為空:
s=`jq '.J1.B' ~/package/sensor_data.json`
使用以下方法:
if [[ $s = """" ]];
then
echo "empty"
else
echo "not_empty"
echo "$s"
fi
jq -r '.[] | if .J1.B == ""
then "description is empty"
else .J1.B end' ~/package/sensor_data.json
k=`jq '.J1.B' ~/package/sensor_data.json select (.!=null)`
echo "$k"
if [ -z "$s" ]
then
echo "\$var is empty"
else
echo "\$var is NOT empty"
echo "$s"
fi
它們都不起作用。一切都給我非空和
jq -r '.[] | if .J1.B == ""
then "description is empty"
else .J1.B end' ~/package/sensor_data.json
給我錯誤:
Cannot index number with string "J1"
你能告訴我如何在 bash 腳本中檢查 json 檔案的空字串嗎?
uj5u.com熱心網友回復:
洗掉前導和尾隨空格(如果有)并測驗空字串
echo '{"J1" : {"B" : ""} }' | jq 'if((.J1.B | gsub("^\\s |\\s $";"")) == "") then "empty" else .J1.B end'
"empty"
echo '{"J1" : {"B" : " "} }' | jq 'if((.J1.B | gsub("^\\s |\\s $";"")) == "") then "empty" else .J1.B end'
"empty"
echo '{"J1" : {"B" : " a"} }' | jq 'if((.J1.B | gsub("^\\s |\\s $";"")) == "") then "empty" else .J1.B end'
" a"
uj5u.com熱心網友回復:
這里發生了幾件事。首先要注意的是這個運算式正在回傳"",而不是一個空字串。也就是說,它正在回傳一個帶有 2 個雙引號的字串:
$ jq .J1.B json
""
所以,這個運算式什么也沒產生:
$ s=$(jq .J1.B json)
$ [ -z "$s" ] && echo empty
empty不列印,因為s不為空。它實際上包含字串""。
有幾種方法可以解決這個問題。我首選的方法是將-r(原始)標志傳遞給 jq:
$ s=$(jq -r .J1.B json) ; [ -z "$s" ] && echo empty
empty
這是另一種方法:與雙引號比較:
$ s=$(jq .J1.B json) ; [ "$s" == '""' ] && echo empty
empty
在上面,您可以看到用單引號括起來的字串。使用""""是一種不好的做法 - 因為它評估為另一個空字串旁邊的一個空字串(長度仍然為 0)。
$ a=""""; echo ${#a}
0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/524796.html
上一篇:回圈執行每個子檔案夾中的命令
