Я ожидаю, что последний тест будет ложным в следующем.
$ echo '["a","b","c"]' | jq 'contains(["a"])' true $ echo '["a","b","c"]' | jq 'contains(["d"])' false $ echo '["a","b","c"]' | jq 'contains([""])' true $ jq --version jq-1.6 $
Я что-то упустил?
Из jq документов :
Строка B содержится в строке A, если B является подстрокой A. Массив B содержится в массиве A, если все элементы в B содержатся в любом элементе в A.
"" является подстрокой "a" (и "b" и "c"), поэтому "a" содержит "" и поэтому ["a","b","c"] содержит [""].
""
"a"
"b"
"c"
["a","b","c"]
[""]
Да, это ожидается. Из документации для contains (выделено мной):
contains
Массив B содержится в массиве A, если все элементы в B содержатся в любом элементе в A .
Таким образом, проверяется не то, является ли "" элементом A, а, если "" содержится в одном из элементов A, а пустая строка является подстрокой каждая строка.
A
Следующее делает то, что я намереваюсь, чтобы определить, содержит ли массив пустую строку в качестве элемента.
$ echo '["a","","b"]' | jq 'any(.=="")' true $ echo '["a","b"]' | jq 'any(.=="")' false $
Спасибо тем, кто ответил.