/ / Bash: як передавати елементи масиву як варіанти? - битися, завиватися

Bash: як передавати елементи масиву як параметри? - баш, скрут

Я намагаюся генерувати заголовки для 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

Дякую!