Во-первых - очень простой код:
#!/bin/bash
a_string="string"
readarray -t a <<<"$a_string"
echo "${a[@]}"
echo "${#a[@]}"
# read empty string into array
emptystring=""
readarray -t b <<<"$emptystring"
echo "${b[@]}"
echo "${#b[@]}"
# and now - empty array
c=()
echo "${c[@]}"
echo "${#c[@]}"
И вывод
string
1
1
0
Таким образом, чтение пустой строки в массив bash с readarray -t
показывает длину массива как 1. И только длина действительно пустого массива равна 0.
Мой вопрос - почему это происходит?
В моем случае - вот фрагмент из моего скрипта - выполнить вызов API, получить JSON и применить фильтр jq:
URL_list_json=$(curl -s --request GET "$curl_request" --header "Authorization: Bearer ${token}")
readarray -t URL_names <<<"$(echo "$URL_list_json" | jq -r '.[].Body.monitors[].name')"
Вот пример JSON, который возвращает пустой массив из вызова jq:
[
{
"Header": {
"Region": "dc1",
"Tenant": "tenant1",
"Stage": "test"
},
"Body": {
"monitors": []
}
}
]
и вот JSON с заполненным содержимым, возвращающим непустой массив из вызова jq:
[
{
"Header": {
"Region": "dc2",
"Tenant": "tenant2",
"Stage": "qa"
},
"Body": {
"monitors": [
{
"enabled": true,
"entityId": "TEST-674BA97E74FC74AA",
"name": "production.example.com"
},
{
"enabled": false,
"entityId": "TEST-3E2D23438A973D1E",
"name": "test.example.com"
}
]
}
}
]
Мне нужно проверить, пуст ли массив URL_names
. Если не пусто, то перебрать содержимое. Если пусто - означает, что jq не вернул никаких результатов - белый, чтобы войти и двигаться дальше.
Если я использую if ((${#URL_names[@]}))
как средство проверки, пуст ли массив или нет, он вернет 1, даже если в массиве есть только пустая строка из вызова jq, поэтому эта логика терпит неудачу.
Каковы альтернативные подходы к решению описанного выше случая?
Я могу назначить вывод фильтра jq строке, а затем использовать оператор if, чтобы проверить, пуста ли строка, и если она не пуста, то присвоить строку массиву, но это вводит дополнительные элементы. При таком подходе я могу полностью отказаться от использования массивов — я надеялся использовать для этой задачи только массивы.
Спасибо
an empty string
это не пустая строка, она имеет одну новую строку. - person KamilCuk   schedule 27.09.2020read -a
вместоmapfile
/readarray
? - person Rfroes87   schedule 27.09.2020