Eu tenho o seguinte script de shell:
#!/usr/bin/env bash
PARAMS=( arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 )
[ $# -lt ${#PARAMS[@]} ] && { echo "Usage: $0 ${PARAMS[@]}"; exit 1; }
DATA=$(printf "%s=%s&" ${PARAMS[@]} $@)
echo curl "http://example.com/api/?${DATA%?}"
que visa pegar n -número de parâmetros e associá-los a valores lidos dos argumentos.
Então quando eu corro:
./curl_params.sh 1 2 3 4 5 6 7 8 9
Espero que o formato seja:
curl http://example.com/api/?arg1=1&arg2=2&arg3=3&arg4=4&arg5=5&arg6=6&arg7=7&arg8=8&arg9=9
mas em vez disso, eu tenho:
curl http://example.com/api/?arg1=arg2&arg3=arg4&arg5=arg6&arg7=arg8&arg9=1&2=3&4=5&6=7&8=9
Entendo que preciso combinar ${PARAMS[@]}
com $@
, então os valores são mesclados.
Existe alguma sintaxe Bash que eu possa usar para transpor/mapear os nomes dos argumentos com os valores correspondentes?
Para esclarecer, os nomes dos argumentos podem mudar.
Eu armazenaria
$@
em uma matriz e, em seguida, iteraria sobre os índices: considere esta sessão bash:No entanto, bash não pode lidar
Aparentemente, o bash não consegue lidar com todos os parênteses corretamente: Em um script, recebo este erro:
Então você pode usar um loop diferente:
Observe, não use ALL_CAPS_VARNAMES, deixe-os como reservados pelo shell.
Se o seu PARAMS for sempre "arg" seguido de um número, você não precisa armazenar "$@" em uma matriz, pode se referir a eles com uma variável indireta:
paste
+printf
solução:Teste: