我想根據錯誤消息JSON字段爲空或非空來檢測錯誤。我使用jq來分割成員,但是在我的bash「if」中評估它時遇到了很大的麻煩。bash JSON與jq - 如何檢查空的JSON成員?
我有我的變量$輸入裏面確實有一個ERRMSG成員引用的JSON文件,但作爲一個空字符串(請注意,我的命令行提示符爲〜$):
~$ echo $(jq "." $input)
{ "projectCode": "145", "fullCode": "1", "errMsg": "" }
檢索在ERRMSG場這種情況下,適當地產生一個空字符串:
~$ err=$(jq ".errMsg" $input)
~$ echo $err
""
問題:測試變量似乎是不可能的:
~$ if [ $err = "" ]; then echo EMPTY; else echo CONTENT; fi
CONTENT
由於$ err剛剛顯示「」,我意識到EMPTY。檢查其他方式:
~$ if [ $err != "" ]; then echo EMPTY; else echo CONTENT; fi
EMPTY
所以$ err顯然不是「」,即使echo $ err yield「」? 這怎麼可能?我在這裏錯過了什麼bash功能?
無論如何,讓我們嘗試用一個非空的JSON(改變$輸入內容後):
~$ echo $(jq "." $input)
{ "projectCode": "145", "fullCode": "1", "errMsg": "not empty" }
~$ echo $err
"not empty"
~$ if [ $err != "" ]; then echo EMPTY; else echo CONTENT; fi
bash: syntax error near unexpected token `then'
好,然後屏蔽這樣的:
~$ if [ "$err" != "" ]; then echo EMPTY; else echo CONTENT; fi
bash: syntax error near unexpected token `then'
我想找到一個第二個標記在「不」之後並且不喜歡它。 經過大量的研究我發現這似乎工作真正不可讀的解決方案:
~$ val=$(sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$err" | sed -e 's/\s.*$//')
~$ if [ "$val" = "" ]; then echo "NO ERROR"; else echo "ERROR"; fi
NO ERROR
它也適用於非空ERRMSG成員。請,那裏必須是一個簡單而優雅的解決方案。
'[$ err =「」]'不安全的bash代碼;與'jq'無關。如果'err'爲空,則運行'[=「」]',這是無效的語法。你需要'[「$ err」=「」]'。 –
至於'''if [「$ err」!=「」];然後回顯EMPTY;其他回聲CONTENT; fi''' - 它真的,真的*不是*語法錯誤(儘管'!='意味着有邏輯錯誤)。看到它正確運行在https://ideone.com/CblHNK –
...如果你可以提供[mcve]的代碼形式,其他人可以複製和粘貼以重現該特定的錯誤(理想情況下,測試的複製器在ideone或另一個不偏不倚的第三方沙箱上工作),我很樂意看到它。 –