2016-11-09 26 views
2

對於給定的選擇器jq,我想知道是否選擇器成功或失敗給定其輸入。例如,正常以下指示錯誤狀態:如何確定jq選擇器是成功還是失敗,如果爲null或false可能是有效結果?

% jq -re .bad <<<'{}' 
null 
% echo $? 
1 
% 

但是,不正確下列指示錯誤狀態(據我需要去):

% jq -re .key <<<'{"key":false}' 
false 
% echo $? 
1 
% 

上述的問題是,如果最後一個輸出值爲falsenull,-e選項將返回1狀態。但是,如果JSON輸入中存在false和null值,則此返回狀態會給出錯誤的印象,表明發生了某些故障。

我是否被迫在返回代碼1的情況下檢查密鑰是否存在?例如:

#!/bin/bash 

Result=$(jq -re .key <<<'{"key":false}') 
Status=$? 
if [[ $Status -eq 1 ]] ; then 
    jq -re '. | has("key")' <<<'{"key":false}' && (exit 0) || (exit 1) 
else 
    (exit $Status) 
fi 

# At this point $? can be relied on to indicate success/failure 

將上述溶液將1返回狀態改變爲0,併爲簡單JQ選擇器上可接受的,但這種解決方案不是對可能產生的虛假或空有效結果計算選擇令人滿意。

那麼,有沒有辦法知道JQ選擇是否真正成功還是失敗(即使是計算選擇器),考慮的結果,如falsenull可以是有效或無效取決於選擇和輸入

該解決方案應該在Bash 4.2或更高版本中完成。

回答

0

請記住,它只取決於過濾器的最後結果。因此,在最後添加支票作爲過濾器的一部分可能會更容易。你只需要記住忽略最後的結果。

$ jq -re --arg key 'key' '.[$key], has($key)' <<< '{"key":false}' 
false 
true 
$ echo $? 
0 
+0

不幸的是,選擇器是一個關鍵是不是我已經提出的問題。而且,我已經發布了一個不需要額外解析的解決方案。使用計算選擇器(非關鍵選擇器),過程並不簡單。我最終希望得到的是一個真正表明錯誤狀態的jq選項。我現在認爲,當前的解決方案/解決方案需要成爲一個組合,分別處理簡單的選擇器案例或計算選擇器。 –

0

這是不完全清楚,我什麼是你正在嘗試做 ,但我有,你會了解它的錯誤的方式印象。 部分問題可能是術語問題的結果。 爲了避免它們,我將採用適合於JSON和jq的術語。

我首先指出,在jq中,諸如{} | .a之類的表達式不會被認爲是錯誤的。如果您想在被訪問一個不存在的鍵值試圖提高一個錯誤條件, 你可以寫這樣的:

if has("a") then .a else error("no such key") end 

另一種方式的情況下區分當輸入對象有一個鍵和的情況下,當它不具備關鍵 是寫類似:

如果有(「一」),那麼別的。一個空結束

或更簡潔:

選擇(H as(「a」))| 。一個

您可以結合使用此技術與JQ的-c選項通過以下的bash分配如圖所示:

result=$(jq -c 'select(has("a")) | .a' INPUT.json) 
n=$(wc -l <<< "$result") 

然後,您可以檢查$ N的值。

+0

在一般情況下,過濾器不只是一個簡單的鍵,而可能是計算。例如,'jq -r --arg Name $(whoami)'。[] | select(.user == $ Name)| .value'<<<'[{「user」:「steve」,「value」 :false},{「user」:「tom」,「value」:true}]''。如果登錄用戶是'steve',那麼成功的結果是'false',並且返回代碼應該是0.如果登錄用戶是'mary',那麼返回代碼不應該是0.請注意,在上面的代碼,在所有情況下,返回碼都是0.這就是問題所在。 –

0

我覺得這個過濾器將工作:

map(select(.user==$Name and .value==true))[0] or error($Name) 

例子:

#!/bin/bash 
for i in steve tom mary; do 
    echo '[{"user":"steve", "value":false},{"user":"tom", "value":true}]' \ 
    | jq -M -r --arg Name $i 'map(select(.user==$Name and .value==true))[0] or error($Name)' 
    echo $i $? 
done 

輸出:

jq: error (at <stdin>:1): steve 
steve 5 
true 
tom 0 
jq: error (at <stdin>:1): mary 
mary 5 

所以在stevemary JQ的情況下返回非零退出狀態並且在tom的情況下它返回零出口狀態秒。

相關問題