GNU/Linux >> Tutoriels Linux >  >> Linux

Comment utiliser un caractère spécial comme caractère normal dans les shells Unix ?

De nombreuses questions telles que "Comment taper le guillemet double (") ?" sont posées, et nous ne voulons pas encombrer notre communauté avec la même réponse (Tapez-la comme " s'il n'est pas entouré de ' s, " si inclus dans ' s.) Alors, la question est là.

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

echo Updates (11)

Alors, comment taper ces caractères dans le terminal comme s'il s'agissait de caractères normaux ?

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

Réponse acceptée :

Cela dépend beaucoup de la coque. Consultez le manuel de votre coque 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 les contextes de liste,
dans les shells POSIX ou de type csh, ~ n'est spécial qu'au début d'un mot ou après certains caractères comme : . Idem pour = en zsh . Dans certains shells, [ n'est spécial que lorsqu'il correspond (avec certaines restrictions) à un ] .

Dans certains shells comme bash ou yash , les caractères spéciaux tels que les séparateurs de jetons vides varient également en fonction des paramètres régionaux.

Les opérateurs de guillemets (pour supprimer la signification particulière de ces caractères) varient également considérablement d'un shell à l'autre.

Coquillages de type Bourne

Un résumé des shells de type Bourne (c'est-à-dire les shells connus pour s'appeler sh sur tel ou tel système depuis les années 80) :

Coquillage Bourne

Caractères spéciaux :

  • "'&|;()^`<>$ , l'espace, la nouvelle ligne et la tabulation sont spéciaux dans les lignes de commande simples lorsqu'ils ne sont pas entre guillemets.
  • # (sauf dans la première version) est spécial au début d'une ligne ou après un espace, une tabulation ou un &|()^<>;` sans guillemets .
  • { et } sont uniquement spéciaux en ce qu'ils sont des mots clés du shell (donc uniquement des mots en position de commande).
  • *?[ sont spéciaux en tant qu'opérateurs globaux, donc uniquement dans des contextes de liste. Dans le cas de [ , c'est [...] c'est l'opérateur global, soit [ ou ] il suffit d'être cité entre guillemets pour supprimer la signification spéciale.
  • = est spécial dans des 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 d'argument (sauf après set -k ).

Citer les opérateurs

  • cite tous les caractères spéciaux sauf newline (<newline> est un moyen de continuer une longue logique ligne sur la prochaine ligne physique ligne, de sorte que la séquence est supprimée). Notez que les backticks ajoutent une complexité supplémentaire car en leur sein, est utilisé en premier pour échapper le backtick de fermeture et aider l'analyseur. Entre guillemets doubles, ne peut être utilisé que pour s'échapper, " , $ et ` (<newline> est toujours une continuation de ligne). À l'intérieur d'un document ici, pareil sauf pour " . est le seul moyen d'échapper les caractères à l'intérieur des documents ici.
  • "..." 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.

Coquilles POSIX

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

  • ^ n'est plus un caractère spécial
  • ~ est spécial dans certains contextes
  • { est autorisé à être spécial et doit donc être cité.

ksh

comme POSIX sauf que :

  • {string} est spécial si la chaîne contient un , sans guillemets (ou .. dans certains cas et avec certaines versions).
  • ksh93 a un opérateur de guillemets 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 a aussi un $"..." opérateur de guillemets qui fonctionne comme "..." sauf que la chaîne est sujette à localisation (peut être configurée pour être traduite dans la langue de l'utilisateur). mksh ignore le $ dans $"..." .
  • depuis ksh93r , ksh93 prend en charge le style csh (non activé par défaut) avec -H / -o histexpand dans les shells interactifs) ce qui rend ^ au début des commandes et ! spécial. ! est alors spécial dans certains contextes (pas lorsqu'il est suivi d'un espace ou d'une tabulation ni dans les documents ici) et n'est pas échappé par des guillemets doubles. Seuls les barres obliques inverses (pas entre guillemets doubles) et les guillemets simples y échappent.

bash

comme ksh93 mais :

  • dans les paramètres régionaux de caractères à un octet, tous vides (selon les paramètres régionaux) les caractères 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 8ème bit défini au cas où ils pourraient être un caractère vide dans certains paramètres régionaux.
  • l'expansion de l'historique csh est activée par défaut dans les instances interactives, avec les mêmes notes que sur ksh93 ci-dessus, sauf que dans les nouvelles versions de bash , ! n'est pas non plus spécial parfois, lorsqu'il est suivi d'un " .

zsh

comme ksh93 mais :

  • même remarque que pour bash pour l'extension de l'historique csh
  • = est spécial comme premier caractère d'un mot (=ls se développe en /bin/ls ).
  • { et } peut également ouvrir et fermer des groupes de commandes lorsqu'ils ne sont pas délimités (comme dans {echo text} fonctionne comme le { echo text;} de Bourne ).
  • sauf pour [ seul, [ doit être cité même s'il n'est pas fermé par un ] .
  • Avec le extendedglob option activée, # , ^ et ~ sont des opérateurs globaux.
  • Avec le braceccl option, {non-empty-string} est spécial.
  • $"..." n'est pas pris en charge.
  • comme bizarrerie spéciale, ? n'est pas spécial lorsqu'il suit un % (même entre guillemets ou développé) au début d'un mot (pour autoriser le %?name cahier des charges)
  • un rcquotes option (non activée par défaut) permet d'entrer des guillemets simples comme '' entre guillemets simples à la rc (voir ci-dessous).
Connexe :LVM a-t-il un impact sur les performances ?

yash

comme POSIX sauf ça.

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

Pour tous les shells, il existe des contextes particuliers où les guillemets fonctionnent différemment. Nous avons déjà mentionné ici les documents et les backticks, mais il y a aussi [[...]] dans ksh et quelques autres shells, POSIX $((...)) , case construit…

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

Résumé

Dans les shells de type Bourne, !#$^&*?[(){}<>~;'"`|= , SPC, TAB, NEWLINE et certains octets avec le 8ème bit défini 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.

Utiliser :

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

    printf '%sn' '// 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 jeton.

  • utilisez "..." pour citer des caractères tout en permettant l'expansion des paramètres ($var , $# , ${foo#bar} …), développement 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 voulez mettre ces extensions entre guillemets doubles dans tous les cas. Vous pouvez utiliser dans "..." pour supprimer la signification spéciale des caractères qui sont encore spéciaux (mais seulement eux).

  • si la chaîne contient ' 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 le $(...) moderne forme de substitution de commande. Utilisez uniquement l'ancien `...` pour la compatibilité avec le shell Bourne, 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 (modification 2020 : uniquement dans la version 2.41 et les versions antérieures, il a depuis été modifié dans 2.42 / bug report / commit), mais utilisez :

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

    qui fonctionnera avec tous.

    Les imbriquer de manière portable avec des guillemets doubles est également impossible, donc encore une fois, utilisez des variables. Attention également au traitement spécial antislash :

    var=`printf '%sn' '\'`
    

    Ne stockera qu'une seule barre oblique inverse dans $var , car il existe un niveau supplémentaire de traitement de la barre oblique inverse (pour , ` et $ (et aussi " entre guillemets sauf en yash )) dans les backticks donc vous avez besoin soit

    var=`printf '%sn' '\\'`
    

    ou

    var=`printf '%sn' '\'
    

    à la place.

Famille Csh

csh et tcsh ont une syntaxe très différente, bien qu'il y ait encore beaucoup en commun avec le shell Bourne car ils partagent un héritage commun.

Caractères spéciaux :

  • "'&|;()^`<>$ , l'espace, la nouvelle ligne et la tabulation sont spéciaux partout lorsqu'ils ne sont pas entre guillemets.
  • # (csh est le shell qui a introduit # en tant que leader du commentaire) est spécial au début d'un script ou après un espace, une tabulation ou une nouvelle ligne sans guillemets.
  • *?[ sont spéciaux en tant qu'opérateurs globaux donc dans les contextes de liste
  • {non-empty-string} est spécial (csh est le shell qui a introduit l'expansion des accolades).
  • ! et ^ sont spéciaux dans le cadre de l'expansion de l'historique (encore une fois, une invention de csh), et les règles de citation sont spéciales.
  • ~ (l'expansion du tilde est également une invention csh) est spéciale dans certains contextes.

Citer les opérateurs

Ce sont les mêmes que pour le shell Bourne, 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 bogues 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 à l'exception de la nouvelle ligne (comme pour le shell Bourne). C'est le seul opérateur de guillemets qui peut échapper ! . <newline> ne l'échappe pas mais le transforme d'un séparateur de commande en un séparateur de jeton (comme un espace)
  • "..." échappe tous les caractères sauf lui-même, $ , ` , saut de ligne et ! . Contrairement au shell Bourne, vous ne pouvez pas utiliser pour échapper $ et ` à l'intérieur de "..." , mais vous pouvez utiliser pour échapper ! ou saut de ligne (mais pas lui-même sauf avant un ! ou saut de ligne). Un ! est "!" et un ! littéral est "\!" .
  • '...' échappe tous les caractères sauf lui-même, ! et nouvelle ligne. Comme pour les guillemets doubles, ! et la nouvelle ligne peut être échappée avec une barre oblique inverse.
  • la substitution de commande se fait uniquement via le `...` syntaxe et peut difficilement être utilisé de manière fiable.
  • la substitution de variables est également assez mal conçue et sujette aux erreurs. Un $var:q aide à écrire un code plus fiable impliquant des variables.
En relation :Où se trouvent les opérations spéciales de collage d'Excel dans Google Sheets ?

Résumé

É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 intègrent des caractères de nouvelle ligne et/ou de barre oblique inverse, le mieux est peut-être d'utiliser uniquement des guillemets simples et $var:q pour une expansion variable. Vous devrez utiliser des boucles si vous souhaitez joindre les éléments d'un tableau de manière fiable.

rc famille

rc est le plan9 shell et comme ses descendants es et akanga a été porté sur Unix et les unix-like. C'est un shell avec une syntaxe beaucoup plus propre et meilleure et celui 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 entre guillemets.
  • *?[ sont des opérateurs globaux.

Opérateur de devis

'...' est le seul opérateur de citation. 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 expérimental shell basé sur rc .

Il a quelques différences cependant. Celui qui nous intéresse pour ce Q/A est que est également un opérateur de guillemets (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 antislash…

poisson

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

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 lorsqu'il suit un espace, une tabulation, une nouvelle ligne ou un ;&|^<>
  • *? (mais pas [...] ) opérateurs de globalisation

Citer les opérateurs

  • cite un seul caractère spécial à l'exception de la nouvelle ligne, mais attention, il sert également de séquence d'échappement C (n , b …) introducteur. IOW, n n'est pas un n entre guillemets 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 les é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.

Linux
  1. Comment utiliser BusyBox sous Linux

  2. Comment utiliser la commande Su sous Linux

  3. Comment utiliser la commande Coproc dans divers shells ?

  4. Qu'est-ce qu'un caractère spécial et un bloc de fichiers spéciaux dans un système Unix ? ?

  5. comment utiliser pylint dans vim

Comment utiliser la commande grep sous Linux/UNIX

Comment utiliser Instagram dans le terminal

Comment utiliser la commande PS

Comment utiliser la commande TOP

Comment utiliser dos2unix ?

Comment vérifier si une chaîne contient un caractère spécial ([email protected]#$%^&*()_+)