Les guillemets sont supprimés avant que les arguments ne soient passés à votre script, il est donc trop tard pour les conserver. Ce que vous pouvez faire est de préserver leur effet lors du passage des arguments à la commande interne et de reconstruire une version équivalente entre guillemets/échappée des arguments pour l'impression.
Pour passer les arguments à la commande interne "[email protected]"
-- avec les guillemets doubles, [email protected] conserve les sauts de mots d'origine, ce qui signifie que la commande interne reçoit exactement la même liste d'arguments que votre script.
Pour l'impression, vous pouvez utiliser le format %q dans la commande printf de bash pour reconstruire les guillemets. Notez que cela ne reconstruira pas toujours la citation d'origine, mais construira un équivalent chaîne entre guillemets/échappée. Par exemple, si vous avez passé l'argument 'uptime ; uname -a'
il pourrait imprimer uptime\ \;\ uname\ -a
ou "uptime ; uname -a"
ou tout autre équivalent (voir la réponse de @William Pursell pour des exemples similaires).
Voici un exemple d'utilisation :
printf "Running command:"
printf " %q" innercmd "[email protected]" # note the space before %q -- this inserts spaces between arguments
printf "\n"
innercmd "[email protected]"
Si l'utilisateur appelle votre commande en tant que :
./script 'foo'
le premier argument donné au script est la chaîne foo
sans les guillemets. Il n'y a aucun moyen pour votre script de faire la différence entre cela et l'une des autres méthodes par lesquelles il pourrait obtenir foo
comme argument (par exemple ./script $(echo foo)
ou ./script foo
ou ./script "foo"
ou ./script \f\o""''""o
).
Si vous souhaitez imprimer la liste des arguments aussi proche que possible de ce que l'utilisateur a probablement saisi :
#!/bin/bash
chars='[ !"#$&()*,;<>?\^`{|}]'
for arg
do
if [[ $arg == *\'* ]]
then
arg=\""$arg"\"
elif [[ $arg == *$chars* ]]
then
arg="'$arg'"
fi
allargs+=("$arg") # ${allargs[@]} is to be used only for printing
done
printf '%s\n' "${allargs[*]}"
Ce n'est pas parfait. Un argument comme ''\''"'
est plus difficile à accommoder qu'il n'est justifié.