GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo usar un carácter especial como uno normal en Unix Shells?

Se hacen muchas preguntas como "¿Cómo escribir el carácter entre comillas dobles (")?" y no queremos saturar a nuestra comunidad con la misma respuesta (Escriba como " si no está encerrado en ' s, " si está encerrado en ' s.) Entonces, la pregunta está aquí.

No puede escribir caracteres especiales en una terminal como los normales, p. este comando fallará:

echo Updates (11)

Entonces, ¿cómo escribir estos caracteres en la terminal como si fueran normales?

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

Respuesta aceptada:

Eso depende mucho del caparazón. Consulte el manual de su caparazón para obtener más detalles.

También tenga en cuenta que algunos caracteres solo son especiales en algunos contextos. Por ejemplo, en la mayoría de los shells, * y ? solo son especiales en contextos de lista,
en POSIX o shells tipo csh, ~ solo es especial al comienzo de una palabra o después de algunos caracteres como : . Lo mismo para = en zsh . En algunos shells, [ solo es especial cuando coincide (con algunas restricciones) con un ] .

En algunos shells como bash o yash , los caracteres especiales como los delimitadores de fichas en blanco también varían según la configuración regional.

Los operadores de comillas (para eliminar el significado especial de esos caracteres) también varían mucho entre shells.

Conchas tipo Bourne

Un resumen de shells tipo Bourne (es decir, los shells que se sabe que se llaman sh en algún sistema u otro desde los años 80):

Concha de Bourne

Caracteres especiales:

  • "'&|;()^`<>$ , el espacio, la nueva línea y el tabulador son especiales en las líneas de comando simples cuando no se citan.
  • # (excepto en la versión anterior) es especial al comienzo de una línea o después de un espacio sin comillas, tabulador o &|()^<>;` .
  • { y } son especiales solo porque son palabras clave de shell (por lo tanto, solo palabras en posición de comando).
  • *?[ son especiales como operadores globales, por lo que solo en contextos de lista. En el caso de [ , es [...] ese es el operador global, ya sea [ o ] solo es necesario citarlo para eliminar el significado especial.
  • = es especial en contextos en los que se trata como un operador de asignación. Es decir, en un comando simple, para todas las palabras que no siguen un argumento (excepto después de set -k ).

Operadores de cotización

  • cita todos los caracteres especiales excepto la nueva línea (<newline> es una manera de continuar un largo lógico línea al siguiente físico línea, por lo que se elimina esa secuencia). Tenga en cuenta que los acentos graves agregan una complejidad adicional, ya que dentro de ellos, se usa primero para escapar del acento grave de cierre y ayudar al analizador. Dentro de comillas dobles, solo puede usarse para escapar de sí mismo, " , $ y ` (<newline> sigue siendo una continuación de línea). Dentro de un documento aquí, igual excepto por " . es la única forma de escapar de los caracteres dentro de los documentos aquí.
  • "..." las comillas dobles escapan de todos los caracteres menos de sí mismo, , $ y ` .
  • '...' las comillas simples escapan a todos los caracteres excepto a sí mismas.

Conchas POSIX

Los shells POSIX se comportan principalmente como el shell Bourne, excepto que:

  • ^ ya no es un carácter especial
  • ~ es especial en algunos contextos
  • { se permite que sea especial, por lo que debe citarse.

ksh

como POSIX excepto que:

  • {string} es especial si la cadena contiene un , sin comillas (o .. en algunos casos y con algunas versiones).
  • ksh93 tiene un operador de comillas especial adicional:$'...' con reglas complejas. Ese operador también se encuentra (con algunas variaciones) en bash , zsh , mksh y FreeBSD y busybox sh .
  • ksh93 también tiene un $"..." operador de comillas que funciona como "..." excepto que la cadena está sujeta a localización (podría configurarse para que se traduzca al idioma del usuario). mksh ignora el $ en $"..." .
  • desde ksh93r , ksh93 admite el estilo csh (no habilitado de forma predeterminada) con -H / -o histexpand en conchas interactivas) lo que hace que ^ al comienzo de los comandos y ! especial. ! es entonces especial en algunos contextos (no cuando va seguido de un espacio o TAB ni en los documentos aquí) y no se le escapa entre comillas dobles. Solo la barra invertida (no entre comillas dobles) y las comillas simples escapan.

bash

como ksh93 pero:

  • en locales de caracteres de un solo byte, todo en blanco (según la configuración regional) los caracteres se consideran delimitadores (como espacios o tabulaciones). En efecto, eso significa que debe citar todos los bytes con el bit 8 establecido en caso de que puedan ser un carácter en blanco en alguna configuración regional.
  • La expansión del historial de csh está habilitada de forma predeterminada en instancias interactivas, con las mismas notas que en ksh93 anterior, excepto que en las versiones más nuevas de bash , ! tampoco es especial a veces, cuando va seguido de un " .

zsh

como ksh93 pero:

  • misma nota que para bash para la expansión del historial de csh
  • = es especial como el primer carácter de una palabra (=ls se expande a /bin/ls ).
  • { y } también puede abrir y cerrar grupos de comandos cuando no están delimitados (como en {echo text} funciona como { echo text;} de Bourne ).
  • excepto [ solo, [ necesita citarse incluso si no se cierra con un ] .
  • Con el extendedglob opción habilitada, # , ^ y ~ son operadores globales.
  • Con braceccl opción, {non-empty-string} es especial.
  • $"..." no es compatible.
  • como una peculiaridad especial, ? no es especial cuando se sigue un % (incluso citado o ampliado) al comienzo de una palabra (para permitir que el %?name especificación del trabajo)
  • a rcquotes opción (no habilitada de manera predeterminada) permite ingresar comillas simples como '' dentro de comillas simples a la rc (ver más abajo).
Relacionado:¿LVM afecta el rendimiento?

yash

como POSIX excepto eso.

  • todos los caracteres en blanco se consideran delimitadores.
  • Con brace-expand opción, implementa la expansión de llaves estilo zsh.

Para todos los shells, hay algunos contextos especiales en los que las comillas funcionan de manera diferente. Ya hemos mencionado aquí documentos y acentos graves, pero también hay [[...]] en ksh y algunos otros shells, POSIX $((...)) , case construcciones…

También tenga en cuenta que las comillas pueden tener otros efectos secundarios cuando se trata de expansiones (con comillas dobles) o cuando se aplican a los delimitadores de documentos aquí. También deshabilita las palabras reservadas y afecta la expansión de alias.

Resumen

En shells tipo Bourne, !#$^&*?[(){}<>~;'"`|= , SPC, TAB, NEWLINE y algunos bytes con el bit 8 son o pueden ser especiales (al menos en algunos contextos).

Para eliminar el significado especial para que se traten literalmente, utilice comillas.

Usar:

  • '...' para eliminar el significado especial de cada carácter:

    printf '%sn' '// Those $quoted$ strings are passed literally as
    single arguments (without the enclosing quotes) to `printf`'
    
  • para eliminar el significado especial de un solo carácter:

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

    Arriba, solo el carácter de espacio precedido por un se pasa literalmente a printf . Los otros son tratados por el shell como delimitadores de fichas.

  • usa "..." para citar caracteres sin dejar de permitir la expansión de parámetros ($var , $# , ${foo#bar} …), expansión aritmética ($((1+1)) , también $[1+1] en algunos shells) y sustitución de comandos ($(...) o la forma antigua `...` . En realidad, la mayoría de las veces, querrá poner esas expansiones entre comillas dobles en cualquier caso. Puedes usar dentro de "..." para eliminar el significado especial de los caracteres que siguen siendo especiales (pero solo ellos).

  • si la cadena contiene ' carácter, aún puede usar '...' para el resto y use otros mecanismos de cotización que puedan citar ' como "'" o ' o (cuando esté disponible) $''' :

    echo 'This is "tricky", isn'''t it?'
    
  • Usa el moderno $(...) forma de sustitución de mando. Solo use el viejo `...` por compatibilidad con el shell Bourne, es decir, un sistema muy antiguo, y solo en asignaciones de variables, como en no usar:

    echo "`echo "foo bar"`"
    

    Lo cual no funcionará con las versiones Bourne shell o AT&T de ksh. O:

    echo "`echo "foo bar"`"
    

    Que funcionará con Bourne y AT&T ksh, pero no con yash (edición de 2020: Sin embargo, solo en la versión 2.41 y anteriores, desde entonces se cambió en 2.42 / informe de error / confirmación), pero use:

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

    que funcionará con todos.

    Anidarlos de manera portátil con comillas dobles también es imposible, así que nuevamente, use variables. También tenga cuidado con el procesamiento especial de barra invertida:

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

    Almacenará solo una barra invertida dentro de $var , porque hay un nivel adicional de procesamiento de barra invertida (para , ` y $ (y también " cuando se cita excepto en yash )) dentro de los acentos graves, por lo que necesita

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

    o

    var=`printf '%sn' '\'
    

    en su lugar.

Familia Csh

csh y tcsh tienen una sintaxis significativamente diferente, aunque todavía tienen mucho en común con el shell de Bourne, ya que comparten una herencia común.

Caracteres especiales:

  • "'&|;()^`<>$ , el espacio, la nueva línea y el tabulador son especiales en todas partes cuando no se citan.
  • # (csh es el shell que introdujo # como líder del comentario) es especial al comienzo de un guión o después de un espacio sin comillas, una pestaña o una nueva línea.
  • *?[ son especiales como operadores globales, por lo que en contextos de lista
  • {non-empty-string} es especial (csh es el shell que introdujo la expansión de llaves).
  • ! y ^ son especiales como parte de la expansión de la historia (nuevamente, una invención de csh), y las reglas de cotización son especiales.
  • ~ (la expansión de la tilde también es una invención de csh) es especial en algunos contextos.

Operadores de cotización

Son los mismos que para el shell Bourne, pero el comportamiento es diferente. tcsh se comporta como csh desde el punto de vista de la sintaxis, encontrará que muchas versiones de csh tienen errores desagradables. Obtenga la última versión de tcsh para obtener una versión de csh que funcione aproximadamente.

  • escapa un solo carácter excepto nueva línea (igual que para el shell Bourne). Es el único operador de comillas que puede escapar ! . <newline> no lo escapa, pero lo transforma de un separador de comandos a un separador de fichas (como el espacio)
  • "..." escapa a todos los caracteres excepto a sí mismo, $ , ` , nueva línea y ! . Contrariamente al shell de Bourne, no puede usar escapar $ y ` dentro de "..." , pero puedes usar para escapar ! o salto de línea (pero no en sí mismo excepto cuando está antes de un ! o nueva línea). Un ! literal es "!" y un literal ! es "\!" .
  • '...' escapa a todos los caracteres excepto a sí mismo, ! y nueva línea. Me gusta para comillas dobles, ! y la nueva línea se puede escapar con una barra invertida.
  • la sustitución de comandos solo se realiza a través de `...` sintaxis y difícilmente se puede utilizar de forma fiable.
  • la sustitución de variables también está bastante mal diseñada y es propensa a errores. Un $var:q El operador ayuda a escribir código más confiable que involucre variables.
Relacionado:¿Dónde están las operaciones especiales de pegado de Excel en las hojas de cálculo de Google?

Resumen

Manténgase alejado de csh si puede. Si no puede usar:

  • comillas simples para citar la mayoría de los caracteres. ! y la nueva línea aún necesita un .
  • puede escapar de la mayoría de los caracteres
  • "..." puede permitir algunas expansiones dentro de él, pero eso es bastante problemático si incorporan caracteres de nueva línea y/o barra invertida, lo mejor es usar solo comillas simples y $var:q para expansión variable. Deberá usar bucles si desea unir elementos de una matriz de manera confiable.

rc familia

rc es el plan9 shell y como sus descendientes es y akanga ha sido portado a Unix y similares a Unix. Ese es un shell con una sintaxis mucho más limpia y mejor, y el que todos usarían si no estuviéramos atrapados con shells tipo Bourne para la compatibilidad con versiones anteriores.

rc /akanga

Caracteres especiales

  • #;&|^$=`'{}()<> , SPC, TAB y NEWLINE son siempre especiales cuando no se citan.
  • *?[ son operadores globales.

Operador de citas

'...' es el único operador de cotización. Un ' literal se escribe con '' entre comillas simples como en:

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

es

es podría verse como un experimental shell basado en rc .

Aunque tiene algunas diferencias. El de interés para esta Q/A es que también es un operador de comillas (que cita todos los caracteres especiales excepto la nueva línea) y también se puede usar para introducir secuencias de escape como n para nueva línea, b para barra invertida…

peces

fish es relativamente nuevo (alrededor de 2005), está diseñado principalmente para uso interactivo y también tiene una sintaxis significativamente diferente de otras conchas.

caracteres especiales

  • "'()$%{}^<>;&| siempre especial cuando no se cita (tenga en cuenta el % (para la expansión pid) como una diferencia significativa de otros shells, y ` no es especial)
  • # (comentario) especial al seguir un espacio sin comillas, tabulador, nueva línea o ;&|^<>
  • *? (pero no [...] ) operadores globales

Operadores de cotización

  • cita un solo carácter especial excepto nueva línea, pero tenga cuidado, también funciona como una secuencia de escape C (n , b …) presentador. OIA, n no es un n citado sino una nueva línea.
  • "..." cita todo menos a sí mismo, $ y la barra diagonal inversa y la barra diagonal inversa se pueden usar para escapar de ellos. <newline> es una continuación de línea (eliminada) dentro de "..." .
  • '...' cita todo excepto a sí mismo y , y puede usar la barra invertida para escapar de ellos.

Linux
  1. Cómo usar Nginx para redirigir

  2. Cómo usar el comando Su en Linux

  3. ¿Cómo usar el comando Coproc en varios shells?

  4. ¿Qué son los archivos especiales de caracteres y bloques especiales en un sistema Unix?

  5. ¿Cómo usar dos2unix?

Cómo usar BusyBox en Linux

Cómo uso cron en Linux

Cómo usar el comando grep en Linux/UNIX

Cómo usar Instagram en la terminal

Cómo usar el comando PS

Cómo usar el comando SUPERIOR