Как одновременно получить доступ к двум индексам массивов для запроса curl в цикле Bash for? - PullRequest
0 голосов
/ 10 декабря 2018

В Bash я пытаюсь запросить валюты стран из http://free.currencyconverterapi.com/api/v5/convert?q=USD_GBP и автоматически обновлять мой OpenEdge API без жесткого кодирования символов.Это означает, что мне нужно свернуть и сохранить символы валют из моего API в массиве, а затем свернуть и сохранить значения из API конвертера валют.после этого я хочу запустить два цикла for одновременно или получить доступ к индексам двух массивов одновременно, чтобы выполнить вызов API, требующий ввода

url/rest/USD/12

.

В bash я вызываю curl, который возвращает

ZAR USD EUR BWP CHF GBP  

из моего API в одну строку.Затем я сохраняю этот результат в переменной с именем currency

jsonEnd="_ZAR.val"
symbolEnd="_ZAR"

Затем запускаю

values=()
for j in ${currency[*]};
do
        ${values[j]}=$(curl -X GET -H "Content-type: application/json" http://free.currencyconverterapi.com/api/v5/convert?q=${currency[j]}$symbolEnd&compact=y | jq '.${currency[j]}$jsonEnd')         
done

Чтобы получить значения валют в массив, где '_ZAR.val' - из jsonВ результате я попытался указать на «val» с помощью jq

{
"USD_ZAR": {
    "val": 14.23065
} }

, наконец, я пытаюсь запустить POST Curl, для которого требуется соответствующий относительный символ валюты, такой как USD, со значением для обновления.в этой форме

curl -X PUT -H "Content-Type: application/json" -H "Authorization: $context" http://192.168.xxx.xxx:8080/rest/exchangerates/USD/12

я пробовал это

for i in ${values[@]}
do    
      curl -X PUT -H "Content-Type: application/json" -H "Authorization: $context" http://192.168.xxx.xxx:8080/rest/exchangerates/${currency[i]}/${values[i]}
done

я не могу понять это правильно, ошибки включают

curl: (6) Could not resolve host: USD_ZAR

и т. д. Я новичок в bash

1 Ответ

0 голосов
/ 10 декабря 2018

И ${currency[*]}, и ${currency[*]} будут расширены до значений внутри массива.Поэтому, когда вы пишете ...

for j in "${currency[@]}"; do
    echo "${currency[j]}"         
done

... вы не получаете доступ к чему-то вроде ${currency[0]}, но ${currency[USD]}, который не существует.

Кроме того, назначать переменные вы не можетенаписать ${array[i]}=value, но использовать array[$i]=value.

Вы также можете переключиться на ассоциативный массив (также известный как словарь или карта ), где выможно использовать строки в качестве индексов.Вот грубый скелет:

currencies=(ZAR USD EUR BWP CHF GBP)
declare -A values
for c in "${currencies[@]}"; do
    values["$c"]="$(curl ..."$c"... | jq ..."$c"... )"
done

c=EUR
echo "The value of $c is ${values[$c]}"
...