Ce post est vieux, mais j'aimerais ajouter cette réponse parce que les autres réponses ne sont pas satisfaisantes.
Il y a 2 facile et sûr règles qui fonctionnent, non seulement en sh
mais aussi bash.
1. Mettre l'ensemble de la chaîne de caractères entre guillemets simples.
Cela fonctionne pour tous les caractères sauf le devis lui-même. Pour échapper à l'apostrophe, fermer le citer avant, insérez l'apostrophe, et ré-ouvrir le citant.
'I'\''m a s@fe $tring which ends in newline
'
Une commande sed pour elle: sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/"
2. Échapper tous les caractères avec une barre oblique inverse.
Cela fonctionne pour tous les caractères sauf le saut de ligne. Pour les caractères de saut de ligne utiliser des guillemets simples ou doubles.
\I\'\m\ \a\ \s\@\f\e\ \$\t\r\i\n\g\ \w\h\i\c\h\ \e\n\d\s\ \i\n\ \n\e\w\l\i\n\e"
"
Une commande sed pour elle: sed -e 's/./\\&/g; 1!s/^/"/; $!s/$/"/'
.
Notez que dans un programme sed, on ne peut pas savoir si la dernière ligne de l'entrée se termine par un saut de ligne octet (sauf quand elle est vide). C'est pourquoi les deux au-dessus de commandes sed supposer qu'il ne le fait pas. Vous pouvez ajouter une cité de retour à la ligne manuellement.
Notez que les variables shell ne sont définies que pour le texte dans la POSIX sens. Traitement des données binaires n'est pas défini. Pour les implémentations de la question, binaire travaille à l'exception de NUL octets (parce que les variables sont mises en œuvre avec chaînes C, et destiné à être utilisé en tant que chaînes C, à savoir les arguments du programme), mais vous devez passer à un "binaire" locale comme latin1.
(Vous pouvez facilement valider les règles par la lecture de la POSIX spec sh
. Pour bash, vérifiez le manuel de référence lié par @AustinPhillips)