web-dev-qa-db-fra.com

Comment échapper à un guillemet simple dans une chaîne de guillemets simples dans Bash?

Je veux afficher une chaîne dans Bash comme ceci

I'm a student

Bien sûr, vous pouvez le faire comme ça

echo "I'm a student"

Mais comment y parvenir tout en utilisant des guillemets simples autour de la chaîne?

61
爱国者
echo 'I\'m a student'

ne marche pas. Mais les travaux suivants:

echo $'I\'m a student'

Depuis la page de manuel de bash:

Un guillemet simple ne peut pas apparaître entre guillemets simples, même lorsqu'il est précédé d'une barre oblique inverse.
....
Les mots de la forme $ 'string' sont traités spécialement. Le mot se développe en chaîne, avec des caractères d'échappement antislash remplacés comme spécifié par la norme C ANSI.

103
codaddict

La solution "laide" mentionnée par Glenn Jackman devrait en fait être répertoriée comme une réponse de haut niveau. Cela fonctionne bien et est en fait beau dans certaines situations.

'I'"'"'m a student'

Cela termine la chaîne entre guillemets simples après I, puis démarre immédiatement une chaîne entre guillemets doubles contenant un guillemet simple, puis démarre une autre chaîne entre guillemets simples. Bash concatène ensuite toutes les chaînes contiguës en une seule.

Magnifique!

51
Luke Gedeon

L'exemple ci-dessous fonctionne car le guillemet simple échappé \' est techniquement entre deux arguments entre guillemets simples

echo 'I'\''m a student'
9
Nick Jensen