Передать массив Bash в вызове cURL POST в сценарии оболочки

Я пытаюсь выполнить вызов curl в своем сценарии оболочки, где я хочу передать результат sql в данных.

taleResult = `isql -S$envServer -U$USERNAME -h -b << ENDSQL | grep -vE "^Password: $"
$PASSWORD
set nocount on
GO
USE db_cfg
GO
SELECT tablename from MyTable
GO
ENDSQL`

Результат таблицы выглядит как TableA TableB TableC

liveCalculators=()
if echo "$tableResult"; then
            for line in $tableResult
            do
                MessageLog "Table is $line"
                liveCalculators+=(\"$line\")
            done
endif

Предположим, что у меня есть результат, сохраненный в массиве как liveCalculators

curl_response=` curl_response=`curl -k -X POST "https://myapiurl" \
                -H "accept: */*" \
                -H "Content-Type: application/json" \
                -w ";%{http_code}" \
                -d "@/dev/stdin" <<EOF
                 { "keys": [],, "calcs": ${liveCalculators[@]}}
                EOF`
`

Я получаю Bad Request как ошибку

Подскажите, что можно сделать, чтобы исправить.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Так :

myFlatArr=$(printf '%s\n' "${liveCalculators[@]}" | paste -sd',')
curl -k -X POST "https://myapiurl" \ 
    -H "accept: */*" \
    -H "Content-Type: application/json" \
    -w ";%{http_code}" \
    -d "@/dev/stdin" <<EOF
{ "keys": [], "calcs": [ $myFlatArr ] }
EOF 

Я пробовал curl_response=curl -k -X POST "https://myaoiurl" \ -H "accept: */*" \ -H "Content-Type: application/json" \ -w ";%{http_code}" \ -d "@/dev/stdin" <<EOF { "keys": [], "calcs": ${liveCalculators[@]}} EOF

Aditya Sethi 30.12.2022 14:57

Это не сработало на самом деле

Aditya Sethi 30.12.2022 14:58

Можете ли вы отредактировать свой исходный пост, чтобы показать нам, что такое массив bash?

Gilles Quenot 30.12.2022 14:58

Предыдущий тоже работал. Большое спасибо

Aditya Sethi 02.01.2023 12:39

Выходные данные вашего массива не инкапсулированы как действительный JSON, так как насчет этого:

curl_response=$(curl -k -X POST "https://myapiurl" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"keys\": [], \"calcs\": \"${liveCalculators[@]}\" }" -w ";%{http_code}")

Кроме того, вывод массива liveCalculators представляет собой список BASH, и вам может потребоваться выполнить некоторый синтаксический анализ и выполнить поиск/замену, чтобы преобразовать его в действительный список JSON.

Если у вас установлен jq, попробуйте следующее:

curl_response = "$(curl -k -X POST "https://myapiurl"\
    -H "accept: */*"\
    -H "Content-Type: application/json"\
    -w ";%{http_code}"\
    -d "$(jq -cn '{"keys": [], "calcs": $ARGS.positional}' --args "${liveCalculators[@]}")"
)"

Другие вопросы по теме