web-dev-qa-db-fra.com

Comment utiliser un caractère spécial comme un caractère normal?

De nombreuses questions comme "Comment taper le caractère guillemet double (")? " sont demandés, et nous ne voulons pas encombrer notre communauté avec la même réponse (Tapez-le comme \" si non enfermé dans 's, " si enfermé dans 's.) Donc, la question est ici.

Vous ne pouvez pas taper des caractères spéciaux dans un terminal comme ceux normaux, par exemple cette commande échouera:

echo Updates (11)

Alors, comment taper ces caractères dans le terminal comme s'ils étaient normaux?

!#$^&*?[](){}<>~;'"\|<space><tab><newline>
13
EKons

Cela dépend beaucoup du Shell. Consultez votre manuel Shell pour plus de détails.

Notez également que certains caractères ne sont spéciaux que dans certains contextes. Par exemple, dans la plupart des shells, * Et ? Ne sont spéciaux que dans des contextes de liste, dans des shells POSIX ou de type csh, ~ N'est spécial qu'au début d'un Word ou en suivant certains caractères comme :. Idem pour = Dans zsh. Dans certains shells, [ N'est spécial que lorsqu'il est mis en correspondance (avec certaines restrictions) par un ].

Dans certains shells comme bash ou yash, les caractères spéciaux comme les délimiteurs de jetons vierges varient également en fonction des paramètres régionaux.

Les opérateurs de citation (pour supprimer la signification spéciale de ces caractères) varient également considérablement entre les shells.

Coquilles de Bourne

Un résumé pour les shells de type Bourne (c'est-à-dire les shells connus pour être appelés sh sur un système ou un autre depuis les années 80):

Bourne Shell

Caractères spéciaux:

  • "\'&|;()^`<>$, espace, nouvelle ligne et tabulation sont spéciaux dans les lignes de commande simples lorsqu'ils ne sont pas cités.
  • # (Sauf dans la première version) est spécial au début d'une ligne ou à la suite d'un espace, d'une tabulation ou d'une &|()^<>;`.
  • { Et } Ne sont spéciaux que dans la mesure où ils sont des mots clés Shell (donc uniquement des mots en position de commande).
  • *?[ Sont spéciaux en tant qu'opérateurs de globalisation, donc uniquement dans les contextes de liste. Dans le cas de [, C'est [...] Qui est l'opérateur de globalisation, soit [ Soit ] Doivent seulement être cités pour supprimer la signification spéciale.
  • = Est spécial dans les contextes où il est traité comme un opérateur d'affectation. C'est-à-dire, dans une commande simple, pour tous les mots qui ne suivent pas un argument (sauf après set -k).

Opérateurs de citation

  • \ Cite tous les caractères spéciaux sauf le saut de ligne (\<newline> Est un moyen de continuer une longue ligne logique sur la suivante ligne physique , de sorte que la séquence soit supprimée). Notez que les backticks ajoutent une complexité supplémentaire car en eux, \ Est utilisé en premier pour échapper au backtick de fermeture et aider l'analyseur. À l'intérieur des guillemets doubles, \ Ne peut être utilisé que pour s'échapper, ", $ Et ` (\<newline> Est toujours une ligne- continuation). À l'intérieur d'un document ici, même sauf pour ". \ Est le seul moyen d'échapper des caractères à l'intérieur des documents.
  • "..." Les guillemets doubles échappent à tous les caractères sauf lui-même, \, $ Et `.
  • '...' Les guillemets simples échappent à tous les caractères sauf lui-même.

Coques POSIX

Les shells POSIX se comportent principalement comme le Bourne Shell, sauf que:

ksh

comme POSIX sauf que:

  • {string} Est spécial si la chaîne contient un , (Ou .. Dans certains cas et avec certaines versions).
  • ksh93 a un opérateur de citation spécial supplémentaire: $'...' avec des règles complexes. Cet opérateur se trouve également (avec quelques variantes) dans bash, zsh, mksh et FreeBSD et busybox sh.
  • ksh93 Possède également un opérateur de cotation $"..." Qui fonctionne comme "..." Sauf que la chaîne est sujette à la localisation (peut être configurée pour être traduite dans la langue de l'utilisateur). mksh ignore le $ Dans $"...".

bash

comme ksh93 mais:

  • dans les paramètres régionaux à un octet, tous les caractères vides (selon les paramètres régionaux) sont considérés comme des délimiteurs (comme l'espace ou la tabulation). En effet, cela signifie que vous devez citer tous les octets avec le 8e bit défini au cas où ils pourraient être un caractère vide dans certains paramètres régionaux.
  • Lorsque l'expansion de l'historique csh est activée comme dans les instances interactives, ! Est spécial dans certains contextes et les guillemets doubles n'y échappent pas toujours. Et ^ Est spécial au début d'une commande.

zsh

comme ksh93 mais:

  • même note que pour bash pour l'expansion de l'historique csh
  • = Est spécial car le premier caractère d'un mot (=ls Se développe en /bin/ls).
  • { Et } Peuvent également ouvrir et fermer des groupes de commandes lorsqu'ils ne sont pas délimités (comme dans {echo text} Fonctionne comme { echo text;} De Bourne).
  • sauf pour [ seul, [ doit être cité même s'il n'est pas fermé par un ].
  • Lorsque l'option extendedglob est activée, #, ^ Et ~ Sont des opérateurs de globalisation.
  • Avec l'option braceccl, {non-empty-string} Est spécial.
  • $"..." N'est pas pris en charge.
  • comme particularité spéciale, ? n'est pas spécial lorsque vous suivez un % (même cité ou développé) au début d'un mot (pour autoriser la spécification de travail %?name)
  • une option rcquotes (non activée par défaut) permet de saisir des guillemets simples comme '' dans des guillemets simples à la rc (voir ci-dessous).

yash

comme POSIX sauf cela.

  • tous les caractères vides sont considérés comme des délimiteurs.
  • Avec l'option brace-expand, Implémente l'expansion d'accolade de style zsh.

Pour tous les shells, il existe certains contextes spéciaux où la citation fonctionne différemment. Nous avons déjà mentionné ici des documents et des astuces, mais il y a aussi [[...]] Dans ksh et quelques autres shells, des constructions POSIX $((...)), case ...

Notez également que la citation peut avoir d'autres effets secondaires en ce qui concerne les extensions (avec des guillemets doubles) ou lorsqu'elle est appliquée aux délimiteurs de document ici. Il désactive également les mots réservés et affecte l'expansion des alias.

Sommaire

Dans les shells de type Bourne, !#$^&*?[(){}<>~;'"`\|=, SPC, TAB, NEWLINE et certains octets avec le 8ème bit sont ou peuvent être spéciaux (au moins dans certains contextes).

Pour supprimer la signification spéciale afin qu'ils soient traités littéralement, vous utilisez des guillemets.

Utilisation:

  • '...' Pour supprimer la signification spéciale de chaque caractère:

    printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
    single arguments (without the enclosing quotes) to `printf`'
    
  • \ Pour supprimer la signification spéciale d'un seul caractère:

    printf '<%s>\n' foo bar\ baz #comment
    

    Ci-dessus, seul le caractère espace précédé d'un \ Est passé littéralement à printf. Les autres sont traités par le Shell comme des délimiteurs de jetons.

  • utilisez "..." pour citer des caractères tout en permettant l'expansion des paramètres ($var, $#, ${foo#bar} ...), l'expansion arithmétique ($((1+1)), également $[1+1] dans certains shells) et substitution de commande ($(...) ou l'ancienne forme `...`. En fait, la plupart du temps, vous le faites vous voulez mettre ces extensions entre guillemets doubles dans tous les cas . Vous pouvez utiliser \ Dans "..." Pour supprimer le signification particulière des caractères qui sont encore spéciaux (mais seulement eux).
  • si la chaîne contient le caractère ', vous pouvez toujours utiliser '...' pour le reste et utiliser d'autres mécanismes de citation qui peuvent citer ' comme "'" ou \' Ou (le cas échéant) $'\'':

    echo 'This is "tricky", isn'\''t it?'
    
  • Utilisez la forme moderne de substitution de commandes $(...). Utilisez uniquement l'ancien `...` Pour la compatibilité avec le Bourne Shell, c'est-à-dire avec un système très ancien, et uniquement dans les affectations de variables, comme dans ne pas utiliser:

    echo "`echo "foo bar"`"
    

    Ce qui ne fonctionnera pas avec les versions Bourne Shell ou AT&T de ksh. Ou:

    echo "`echo \"foo bar\"`"
    

    Qui fonctionnera avec Bourne et AT&T ksh, mais pas avec yash, mais utilisez:

    var=`echo "foo bar"`; echo "$var"
    

    qui fonctionnera avec tous.

    Il est également impossible de les imbriquer de manière portative avec des guillemets doubles, alors encore une fois, utilisez des variables. Méfiez-vous également du traitement spécial de barre oblique inverse:

    var=`printf '%s\n' '\\'`
    

    Ne stockera qu'une seule barre oblique inverse à l'intérieur de $var, Car il existe un niveau supplémentaire de traitement de la barre oblique inverse (pour \, `Et $ (Et aussi " Lorsque cité) sauf dans yash)) entre guillemets, vous devez donc soit

    var=`printf '%s\n' '\\\\'`
    

    ou

    var=`printf '%s\n' '\\\'
    

    au lieu.

Famille Csh

csh et tcsh ont une syntaxe sensiblement différente, bien qu'il y ait encore beaucoup de points communs avec le Bourne Shell car ils partagent un héritage commun.

Caractères spéciaux:

  • "\'&|;()^`<>$, espace, nouvelle ligne et tabulation sont spéciaux partout lorsqu'ils ne sont pas cités.
  • # (Csh est le Shell qui a introduit # En tant que leader du commentaire) est spécial au début d'un script ou à la suite d'un espace, d'une tabulation ou d'un saut de ligne sans guillemets.
  • *?[ Sont spéciaux comme opérateurs de globalisation donc dans des contextes de liste
  • {non-empty-string} Est spécial (csh est le Shell qui a introduit l'expansion de l'accolade).
  • ! Et ^ Sont spéciaux dans le cadre de l'expansion de l'histoire (encore une fois, une invention csh), et les règles de citation sont spéciales.
  • ~ (L'extension tilde est également une invention csh) est spéciale dans certains contextes.

Opérateurs de citation

Ils sont les mêmes que pour le Bourne Shell, mais le comportement diffère. tcsh se comporte comme csh du point de vue de la syntaxe, vous constaterez que de nombreuses versions de csh ont des bugs désagréables. Obtenez la dernière version de tcsh pour obtenir une version à peu près fonctionnelle de csh.

  • \ Échappe à un seul caractère sauf la nouvelle ligne (comme pour le Bourne Shell). C'est le seul opérateur de citation qui peut s'échapper !. \<newline> N'y échappe pas mais le transforme d'un séparateur de commandes en un séparateur de jetons (comme l'espace)
  • "..." Échappe à tous les caractères sauf lui-même, $, `, La nouvelle ligne et !. Contrairement au Bourne Shell, vous ne pouvez pas utiliser \ Pour échapper à $ Et ` À l'intérieur de "...", Mais vous pouvez utiliser \ pour échapper à ! ou à la nouvelle ligne (mais pas à lui-même sauf avant un ! ou une nouvelle ligne). Un littéral ! Est "\!" Et un littéral \! Est "\\!".
  • '...' Échappe à tous les caractères sauf lui-même, ! Et la nouvelle ligne. Comme pour les guillemets doubles, ! Et la nouvelle ligne peuvent être échappés avec une barre oblique inverse.
  • la substitution de commande se fait uniquement via la syntaxe `...` et peut difficilement être utilisée de manière fiable.
  • la substitution de variables est également assez mal conçue et sujette aux erreurs. Un opérateur $var:q Permet d'écrire du code plus fiable impliquant des variables.

Sommaire

Éloignez-vous de csh si vous le pouvez. Si vous ne pouvez pas utiliser:

  • guillemets simples pour citer la plupart des caractères. ! Et la nouvelle ligne ont toujours besoin d'un \.
  • \ Peut échapper à la plupart des caractères
  • "..." Peut autoriser certaines extensions, mais c'est assez bogué s'ils incorporent des caractères de nouvelle ligne et/ou de barre oblique inverse, le mieux peut être d'utiliser des guillemets simples uniquement et $var:q Pour l'expansion des variables. Vous devrez utiliser des boucles si vous souhaitez joindre de manière fiable des éléments d'un tableau.

Famille rc

rc est le shell plan9 Et comme ses descendants es et akanga a été porté sur Unix et unix-likes. C'est un Shell avec une syntaxe beaucoup plus propre et meilleure et celle que tout le monde utiliserait si nous n'étions pas coincés avec des shells de type Bourne pour une compatibilité descendante.

rc/akanga

Caractères spéciaux

  • #;&|^$=`'{}()<>, SPC, TAB et NEWLINE sont toujours spéciaux lorsqu'ils ne sont pas cités.
  • *?[ Sont des opérateurs de globalisation.

Opérateur de devis

'...' Est le seul opérateur de cotation. Un ' Littéral est écrit avec '' Entre guillemets simples comme dans:

 echo 'it''s so simple isn''t it?'

es

es pourrait être considéré comme un shell expérimental basé sur rc.

Il y a cependant quelques différences. L'intérêt de cette Q/R est que \ Est également un opérateur de citation (qui cite tous les caractères spéciaux sauf la nouvelle ligne) et peut également être utilisé pour introduire des séquences d'échappement comme \n Pour la nouvelle ligne, \b Pour la barre oblique inverse ...

poisson

fish est un nouveau venu (vers 2005), est principalement destiné à une utilisation interactive et a également une syntaxe significativement différente des autres coquilles.

caractères spéciaux

  • "'\()$%{}^<>;&| toujours spécial lorsqu'il n'est pas cité (notez le % (pour l'expansion pid) comme une différence significative par rapport aux autres shells, et ` n'est pas spécial)
  • # (Commentaire) spécial lorsque vous suivez un espace, une tabulation, une nouvelle ligne ou ;&|^<>
  • *? (Mais pas [...]) Opérateurs de globalisation

Opérateurs de citation

  • \ Cite un seul caractère spécial sauf la nouvelle ligne, mais attention, il se double également d'un introducteur de séquence d'échappement C (\n, \b ...). IOW, \n N'est pas un n cité mais une nouvelle ligne.
  • "..." Cite tout sauf lui-même, $ Et la barre oblique inverse et la barre oblique inverse peuvent être utilisées pour y échapper. \<newline> Est une continuation de ligne (supprimée) à l'intérieur de "...".
  • '...' Cite tout sauf lui-même et \, Et vous pouvez utiliser une barre oblique inverse pour les échapper.
27
Stéphane Chazelas

1. Échapper

Échappez à tous ces personnages avec un \, comme ceci (ne fonctionne pas sur les retours à la ligne/retours chariot):

$ echo Use a \"\\\" symbol to escape characters.
Use a "\" symbol to escape characters.

2. Devis double

Joignez le texte entier dans "s, comme ceci:

$ var=variables;echo "Enclose text in \"s. You can also use $var in them. `echo Surprise!!!`"
Enclose text in "s. You can also use variables in them. Surprise!!!

3. Devis unique

Identique à la citation double, mais il n'y a pas de jeton spécial.

$ proof=proveit;echo 'This should not read "proveit": $proof'
This should not read "proveit": $proof
4
EKons