La réponse de Yuku ne fonctionne que si vous êtes le seul utilisateur de votre script, tandis que celle de Dennis Williamson est excellente si vous êtes principalement intéressé par l'impression des chaînes de caractères, et que vous vous attendez à ce qu'elles n'aient pas de guillemets.
Voici une version qui peut être utilisée si vous voulez passer tous les arguments comme une seule grande chaîne de caractères entre guillemets à la fonction -c
paramètre de bash
o su
:
#!/bin/bash
C=''
for i in "$@"; do
i="${i//\\/\\\\}"
C="$C \"${i//\"/\\\"}\""
done
bash -c "$C"
Así que, tous les arguments sont entourés d'un guillemet (inoffensif s'il n'était pas là avant, dans ce but), mais nous échappons aussi à tout échappement et ensuite à tout guillemet qui était déjà dans un argument (la syntaxe ${var//from/to}
fait une substitution globale des substrats).
Vous pourriez bien sûr ne citer que les choses qui contiennent déjà des espaces, mais cela n'aura pas d'importance ici. Une utilité d'un script comme celui-ci est d'être capable d'avoir un certain ensemble prédéfini de variables d'environnement (ou, avec su, de lancer des choses en tant qu'un certain utilisateur, sans ce désordre de double-citer tout).
Mise à jour : J'ai récemment eu une raison de faire ceci d'une manière POSIX avec un minimum de bifurcation, ce qui a conduit à ce script (le dernier printf ici sort la ligne de commande utilisée pour invoquer le script, que vous devriez être capable de copier-coller afin de l'invoquer avec des arguments équivalents) :
#!/bin/sh
C=''
for i in "$@"; do
case "$i" in
*\'*)
i=`printf "%s" "$i" | sed "s/'/'\"'\"'/g"`
;;
*) : ;;
esac
C="$C '$i'"
done
printf "$0%s\n" "$C"
Je suis passé à ''
puisque les shells interprètent aussi des choses comme $
y !!
en ""
-Citations.