J'écris un script pour exécuter des commandes CURL pour une entrée utilisateur donnée. Le script a plusieurs fonctions auxiliaires pour créer la liste des paramètres (arguments) qui seront éventuellement transmis à CURL.Bash, curl, eval et espace
Un exemple dépouillé, est la suivante:
#!/bin/bash
function create_arg_list
{
# THIS HTTP HEADER VALUE COMES FROM THE USER and MAY CONTAIN SPACES
local __hdr="x-madhurt-test:madh urt"
local __params="http://google.co.in -X GET -H '$__hdr'"
local __resultvar="$1"
eval $__resultvar="\"$__params\""
echo "params after eval : $__resultvar"
}
create_arg_list arg_list
echo "params after eval in main code : $arg_list"
echo "Running command : curl -v $arg_list"
curl -v $arg_list
Le script fonctionne très bien lorsque les paramètres d'entrée (chemin de fichier, etc ..) URL ont (cité) un espace blanc en eux. Cependant, lorsque les arguments censés être transmis en tant que HTTP Headers à CURL contiennent des espaces, le script échoue lamentablement.
Voici ce que j'ai essayé:
- Utilisez des guillemets simples autour de la valeur d'en-tête (par exemple '__ $ hdr'). Cependant, avec ceci la valeur qui est passée à CURL est:
curl -v http://google.co.in -X GET -H 'x-madhurt-test:madh urt'
, qui est traitée comme-par CURL et l'en-tête réel qui est envoyé est comme ceci:'x-madhurt-test:madh
- Double échapper la valeur d'en-tête (par exemple \\ "$ __ hdr \\ "), mais cela semble fonctionner aussi bien. Dans ce cas CURL obtient "urt" comme un paramètre distinct et le traite comme une URL
curl: (6) Couldn't resolve host 'urt"'
- Echapper l'espace dans la valeur d'en-tête (c'est à dire utiliser "madh \ urt" au lieu de "madh urt"), mais cela s'avère être le même que l'option 2.
Est-ce que quelqu'un a des idées sur ce qui se passe mal ici?
Pour votre information: Mon utilisation de eval pour la variable de retour provient de cet article: http://www.linuxjournal.com/content/return- values-bash-functions – madhurtanwani