I have a json file:
cat myjsonfile.json
{
"directory": true,
"condition": "",
"specialCondition": "",
"dataFiles": "",
"nonstandard-protocol": true
}
specialCondition is standardized and can be empty or have a matched or unmatched state.
I simply want to translate those conditions to another state when nonstandard-protocol is false.
So I wrote this in my bash script.
if [[ "jq '.specialCondition' myjsonfile.json | grep -q 'matched'" && "jq '."nonstandard-protocol"' myjsonfile.json | grep -q 'false'" ]]; then echo 'MATCHED' | cat > protocol_result.txt; fi
if [[ "jq '.specialCondition' myjsonfile.json | grep -q 'unmatched'" && "jq '."nonstandard-protocol"' myjsonfile.json | grep -q 'false'" ]]; then echo 'NOTMATCHED' | cat > protocol_result.txt; fi
However, this returns incorrect results. When I run the script, I always see that first it writes MATCHED to my protocol_result.txt and then with the second if line it writes NOTMATCHED to the file! While it shouldn’t write anything at all… Why is this happening?
>Solution :
Take the if statements to jq and have it output whatever you want.
The following example prints nothing "" if nonstandard-protocol is true, or specialCondition is neither matched nor unmatched. Otherwise it’ll print MATCHED or NOTMATCHED, depending on the content of specialCondition:
jq --raw-output '
if ."nonstandard-protocol" then ""
else if .specialCondition == "matched" then "MATCHED"
elif .specialCondition == "unmatched" then "NOTMATCHED"
else "" end
end
' myjsonfile.json > protocol_result.txt
Note: Using "" will print nothing as expected, but followed by a newline because it had an output (which essentially is an empty line, then). If you don’t want that, change "" to empty.