Я намагаюся генерувати заголовки для curl на основі масиву:
HEADERS=( "content-type: text/plain" "Authorization: password" )
Коли я вказую кожного вручну, він працює:
curl --header "${HEADERS[0]}" --header "${HEADERS[1]}" http://httpbin.org/headers
але коли я намагаюся автоматично генерувати, curl скаржиться:
curl `for H in "${HEADERS[@]}";do echo --header $H ;done` http://httpbin.org/headers
curl: (6) Could not resolve host: text
curl: (6) Could not resolve host: password
...
Я без спроби спробував різні втечі та події цитати. Не можете запропонувати спосіб змусити її працювати?
Відповіді:
6 за відповідь № 1Просте і стисле рішення, без петель:
HEADERS=( "content-type: text/plain" "Authorization: password" )
curl "${HEADERS[@]/#/-H}" http://httpbin.org/headers
Вираз заміни виконується незалежно від кожного елемента масиву, при цьому результат вставляється як одне слово на елемент масиву (те саме, що "${HEADERS[@]}"
) The #
у шаблоні означає "замінити лише на початку. Написання параметра командного рядка за допомогою -H
замість --header
значно полегшує додавання назви опцій до кожного рядка, оскільки curl приймає -Hoption_value
, тоді як нормальний синтаксис командного рядка --header=option_value
синтаксис curl не приймається. (Дякуємо @wfr за те, що він зазначив, що завиток не сприймаю --header=...
.)
5 для відповіді № 2
parameters=()
for((i=0; i<${#HEADERS[@]}; i++)); do
parameters+=("--header" "${HEADERS[$i]}");
done
curl "${parameters[@]}"
Дивись також:
0 для відповіді № 3
Мені сподобалась відповідь wfr, але щоб уникнути створення проміжної змінної, я придумав:
for H in "${HEADERS[@]}"; do [[ "$HEADERS" == "-"* ]] || HEADERS=(); HEADERS+=("-H" "$H");done
curl "${HEADERS[@]}" http://httpbin.org/headers
Дякую!