248 votes

Quels caractères doivent être échappés en Bash? Comment savons-nous d'elle?

Est-il une liste complète des caractères doivent être échappés en Bash? Peut-il être vérifié tout avec sed?

En particulier, j'ai été vérifier si % doit être échappés ou pas. J'ai essayé

echo "h%h" | sed 's/%/i/g'

et a bien fonctionné, sans échapper %. Signifie-t-il % n'a pas besoin d'être échappé? Était-ce une bonne façon de vérifier la nécessité?

Et de façon plus générale: sont-ils les mêmes caractères à échapper en shell et bash?

321voto

Jo So Points 4602

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)

45voto

Matthew Points 71

Pour sauver quelqu'un d'autre d'avoir à RTFM... en bash:

Enfermant les personnages dans des guillemets doubles préserve la valeur littérale de tous les caractères dans le devis, à l'exception de l' $, `, \, et, quand l'histoire de l'expansion est activé, !.

...donc, si vous échapper à ceux (et la citation elle-même, bien sûr), vous êtes probablement d'accord.

Si vous prenez un plus conservateur " en cas de doute, s'échapper, il approche, il devrait être possible d'éviter d'obtenir à la place des caractères ayant une signification particulière par échappent pas identificateur de caractères (c'est à dire ASCII des lettres, des chiffres, ou '_'). Il est très probable que ces serait jamais (c'est à dire en quelque étrange POSIX-ish shell) ont une signification particulière et doivent donc être échappé.

18voto

cdarke Points 8020

Les caractères qui ont besoin d'échappement sont différents en Bourne ou le shell POSIX que Bash. Généralement (très) Bash est un sur-ensemble de ces obus, donc tout ce que vous échapper en shell doivent être échappés dans Bash.

Une belle règle générale serait "en cas de doute, s'en échapper". Mais échapper à certains personnages, leur donne une signification particulière, comme \n. Ils sont répertoriés dans la man bash pages en vertu de l' Quoting et echo.

Autres que que, échapper à tout caractère qui n'est pas alphanumérique, c'est plus sûr. Je ne sais pas d'une simple liste définitive.

Les pages de manuel liste de tous quelque part, mais pas en un seul endroit. Apprendre la langue, c'est la façon d'en être sûr.

Celui qui m'a pris de sortir est - !. C'est un caractère spécial (histoire de l'expansion) dans Bash (et csh), mais pas dans le shell Korn. Même echo "Hello world!" donne des problèmes. À l'aide de guillemets simples, comme d'habitude, supprime la signification spéciale.

6voto

Austin Phillips Points 6217

Je présume que vous parlez de bash cordes. Il existe différents types de chaînes de caractères qui ont un ensemble différent de conditions pour s'échapper. par exemple. Les guillemets simples chaînes de caractères sont différents de chaînes entre guillemets doubles.

La meilleure référence est le Citant la section du manuel de bash.

Il explique les caractères qui a besoin de s'échapper. Notez que certains personnages peuvent avoir besoin de s'échapper en fonction des options qui sont activées telles que l'histoire de l'expansion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X