/ / Bash: jak przekazywać elementy tablicy jako opcje? - bash, curl

Bash: jak przekazywać elementy tablicy jako opcje? - bash, curl

Próbuję wygenerować nagłówki dla curl na podstawie tablicy:

HEADERS=( "content-type: text/plain" "Authorization:  password" )

Kiedy ręcznie określę każdą z nich, działa ona:

curl --header  "${HEADERS[0]}"  --header  "${HEADERS[1]}" http://httpbin.org/headers

ale kiedy próbuję generować automatycznie, zwijają się skargi:

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
...

Wypróbowałem różne cytaty ucieczki i zło bez powodzenia. Czy możesz zaproponować sposób, żeby to zadziałało?

Odpowiedzi:

6 dla odpowiedzi № 1

Proste i zwięzłe rozwiązanie, bez pętli:

HEADERS=( "content-type: text/plain" "Authorization:  password" )
curl "${HEADERS[@]/#/-H}" http://httpbin.org/headers

Wyrażenie podstawienia jest wykonywane niezależnie na każdym elemencie tablicy, a wynik jest wstawiany jako jedno słowo na element tablicy (taki sam jak "${HEADERS[@]}"). The # we wzorze oznacza "tylko zastępuje na początku. Zapisywanie opcji wiersza polecenia za pomocą -H zamiast --header znacznie ułatwia dodanie nazwy opcji do każdego ciągu, ponieważ curl akceptuje -Hoption_value, podczas gdy normalna składnia wiersza poleceń --header=option_value składnia nie jest akceptowana przez curl. (Dzięki @wfr za wskazanie, że curl nie zostanie zaakceptowany --header=....)


5 dla odpowiedzi nr 2
parameters=()
for((i=0; i<${#HEADERS[@]}; i++)); do
parameters+=("--header" "${HEADERS[$i]}");
done
curl "${parameters[@]}"

Zobacz też:


0 dla odpowiedzi № 3

Spodobała mi się odpowiedź WFR, ale aby uniknąć tworzenia zmiennej pośredniej, wymyśliłem:

for H in "${HEADERS[@]}"; do [[ "$HEADERS" == "-"* ]] || HEADERS=(); HEADERS+=("-H" "$H");done
curl "${HEADERS[@]}" http://httpbin.org/headers

Dzięki!