GNU/Linux >> Tutoriels Linux >  >> Linux

bash :comment passer des arguments de ligne de commande contenant des caractères spéciaux

Vous pouvez soit :

  1. Echappez chaque symbole spécial avec une barre oblique inverse (comme dans \[abc\]_\[x\|y\] ) ou
  2. Mettre entre guillemets l'intégralité de l'argument (comme dans "[abc]_[x|y]" ).

MODIF : Comme certains l'ont souligné, les guillemets doubles n'empêchent pas l'expansion des variables ni la substitution de commandes. Par conséquent, si votre regex contient quelque chose qui peut être interprété par bash comme l'un d'entre eux, utilisez plutôt des guillemets simples.


Utilisez des guillemets simples. Les guillemets simples garantissent qu'aucun des caractères n'est interprété.

$ printf %s 'spaces  are  not  interpreted away
neither are new lines
nor variable names $TESTING
nor square brackets [TESTING]
nor pipe characters or redirection symbols | > <
nor the semicolon ;
nor backslashes \a \b \c \\
the only thing that does not work is the single quote itself
'

Il existe deux solutions si vous avez besoin d'intégrer un seul guillemet :

$ printf '%s\n' '[ Don'"'"'t worry, be happy! ]'
[ Don't worry, be happy! ]
$ printf '%s\n' '[ Don'\''t worry, be happy! ]'
[ Don't worry, be happy! ]

Par man bash

Il existe trois mécanismes de guillemets :le caractère d'échappement , guillemets simples et guillemets doubles.

Une barre oblique inverse sans guillemets (\ ) est lecaractère d'échappement . Il préserve la valeur littérale du prochain caractère qui suit, à l'exception de . Si un \ La paire apparaît, et la barre oblique inverse n'est pas elle-même entre guillemets, le \ est traité comme une continuation de ligne (c'est-à-dire qu'il est supprimé du flux d'entrée et effectivement ignoré).

Entourer les caractères de guillemets simples préserve la valeur littérale de chaque caractère entre guillemets. Un guillemet simple ne peut pas apparaître entre des guillemets simples, même s'ils sont précédés d'une barre oblique inverse.

L'insertion de caractères entre guillemets doubles préserve la valeur littérale de tous les caractères entre guillemets, à l'exception de $ , ` , \ , et, lorsque l'extension de l'historique est activée,  ! . Les caractères $ et ` conservent leur signification particulière entre guillemets doubles. La barre oblique inverse conserve sa signification particulière uniquement lorsqu'elle est suivie de l'un des caractères suivants :$ , ` , " ,\ , ou . Un guillemet double peut être entre guillemets doubles en le faisant précéder d'une barre oblique inverse. Si elle est activée, l'expansion de l'historique sera effectuée à moins qu'un  ! apparaissant entre guillemets doubles est échappé à l'aide d'une barre oblique inverse. La barre oblique inverse précédant le ! n'est pas supprimé.

Les paramètres spéciaux * et @ ont une signification particulière lorsqu'ils sont entre guillemets (voir PARAMETRES ci-dessous).

Mots de la forme $' chaîne ' sont traités spécialement. Le mot se développe en chaîne , avec les caractères d'échappement avec barre oblique inversée remplacés comme spécifié par la norme ANSI C. Les séquences d'échappement antislash, si elles sont présentes, sont décodées comme suit :

       \a     alert (bell)
       \b     backspace
       \e
       \E     an escape character
       \f     form feed
       \n     new line
       \r     carriage return
       \t     horizontal tab
       \v     vertical tab
       \\     backslash
       \'     single quote
       \"     double quote
       \nnn   the eight-bit character whose value is the octal value nnn
              (one to three digits)
       \xHH   the eight-bit character whose value is the hexadecimal value HH
              (one or two hex digits)
       \uHHHH the Unicode (ISO/IEC 10646) character whose value is
              the hexadecimal value HHHH (one to four hex digits)
       \UHHHHHHHH
              the Unicode (ISO/IEC 10646) character whose value is
              the hexadecimal value HHHHHHHH (one to eight hex digits)
       \cx    a control-x character

Le résultat développé est entre guillemets simples, comme si le signe dollar n'avait pas été présent.

Une chaîne entre guillemets précédée d'un signe dollar ($" chaîne " ) entraînera la traduction de la chaîne en fonction des paramètres régionaux actuels. Si les paramètres régionaux actuels sont C ou POSIX , le signe dollar est ignoré. Si la chaîne est traduite et remplacée, le remplacement est entre guillemets.


Linux
  1. Comment effacer l'historique de la ligne de commande BASH sous Linux

  2. Comment les arguments de la ligne de commande distante Ssh sont-ils analysés ?

  3. Nagios :comment activer les arguments de ligne de commande check_nrpe

  4. Comment passer la sortie de la commande sous forme d'arguments multiples à une autre commande

  5. Bash si sur une seule ligne

Comment commenter dans Bash

Comment afficher l'historique de Bash sans numéros de ligne

Comment sauvegarder une seule base de données MySQL à partir de la ligne de commande

Comment lire les arguments de ligne de commande dans les scripts shell ?

Comment modifier les lignes précédentes dans une commande à plusieurs lignes dans Bash ?

Comment diviser une chaîne avec des guillemets (comme des arguments de commande) dans bash ?