J'ai essayé de nombreuses solutions différentes, une bonne ressource comprenant des informations de base et des alternatives est par exemple BashFAQ / 096 sur le wiki de Greg (aka. GreyCat) . Au total, j'ai trouvé que les deux suivants étaient les plus lisibles (parmi ceux qui fonctionnent):
Depuis Bash 4.4 (pour autant que je sache d'après les NOUVELLES ), il est possible d'utiliser l' expansion des paramètres @Q
comme ceci:
adb sh -c "other_tool -a -b ${*@Q}"
Notez que j'utilise $*
ici au lieu de $@
parce que vous voulez "other_tool -a -b ${*@Q}"
être une seule chaîne au lieu d'une chaîne par argument passé.
Si vous voulez faire de même avec une variable de tableau bash, vous aurez besoin de la syntaxe ${ARRAY[*]@Q}
(entre guillemets).
Si vous n'avez pas Bash 4.4 ou version ultérieure disponible ou n'êtes pas sûr, c'est ma solution préférée:
function escapeBashArgs() {
local arg separator=""
for arg
do
printf "%s%q" "$separator" "$arg"
separator=" "
done
}
adb sh -c "other_tool -a -b $(escapeBashArgs "$@")"
Notez que vous devez utiliser ici à la "$@"
place de $@
ou "$*"
ou $*
parce que vous ne voulez pas que les mots soient séparés dans les arguments, donc les variantes sans guillemets ne peuvent pas être utilisées, et vous voulez que le nombre d'arguments soit conservé, donc "$*"
ne peut pas être utilisé comme il se joindrait tous les arguments d'une seule chaîne. La fonction renvoie ensuite tous les arguments dans une seule chaîne.
Si vous ne vous souciez pas de l'espace supplémentaire devant le premier argument, vous pouvez remplacer la printf
chaîne de format par " %q"
et supprimer la separator
variable. Ou vous pouvez utiliser la réponse à une ligne de Gordon Davissons .
Ces solutions fonctionnent avec tous les cas que je pourrais trouver, en particulier:
- Aucun argument:
escapeBashArgs
→ rien
- Arguments vides:
escapeBashArgs "" ""
→'' ''
- Arguments avec juste des espaces:
escapeBashArgs " " " "
→ ' ' ' '
ou \ \ \ \ \
( le dernier espace est consommé par le rendu de ce site )
- Arguments avec espacement spécial et sauts de ligne:
escapeBashArgs "a b" c\ d "arg with
newline"
→ 'a b' 'c d' $'arg with\nnewline'
ou a\ \ \ \ \ \ b c\ d $'arg with\nnewline'
( le saut de ligne est entre with
et newline
, sur d'autres positions, c'est à cause du retour à la ligne sur ce site )
- Arguments avec des caractères spéciaux:
escapeBashArgs '$"'\''({:})'
→ '$"'\''({:})'
ou\$\"\'\(\{:\}\)
- Exemple de réponse jcayzacs :
escapeBashArgs x/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"
→ 'x/ "b"/aaaaa/'\''xxx yyyy'\''/zz"offf"'
oux/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"
(Testé avec la version GNU bash 5.0.3 (1).)