Eso depende mucho de la cáscara. Consulte el manual de su shell para 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 listas, en POSIX o shells similares a csh, ~
solo es especial al comienzo de una palabra o después de algunos caracteres como :
. Lo mismo para =
adentro zsh
. En algunos shells, [
solo es especial cuando se combina (con algunas restricciones) con a ]
.
En algunos shells como bash
o yash
, los caracteres especiales como los delimitadores de tokens en blanco también varían con la configuración regional.
Los operadores de comillas (para eliminar el significado especial de esos caracteres) también varían mucho entre los shells.
Conchas tipo Bourne
Un resumen de los shells tipo Bourne (es decir, los shells que se sabe que se han llamado sh
en algún sistema u otro desde los años 80):
Concha Bourne
Caracteres especiales:
"\'&|;()^`<>$
, space, newline y tab son especiales en 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, tabulación o &|()^<>;`
.
{
y }
solo son especiales 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 el operador globbing, ya sea [
o ]
solo necesita ser citado para eliminar el significado especial.
=
es especial cuando se trata de contextos donde 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 set -k
).
Operadores de cotizaciones
\
cita todos los caracteres especiales excepto la nueva línea ( \<newline>
es una forma de continuar una línea lógica larga en la siguiente línea física , de modo que se elimina esa secuencia). Tenga en cuenta que los backticks agregan complejidad adicional ya que dentro de ellos, \
se utilizan primero para escapar del cierre de backtick y ayudar al analizador. Dentro de las comillas dobles, \
solo se puede usar para escapar "
, $
y `
( \<newline>
sigue siendo una continuación de línea). Dentro de un documento aquí, igual excepto "
. \
es la única forma de escapar de los personajes dentro de los documentos aquí.
"..."
las comillas dobles escapan a todos los caracteres excepto a sí mismo \
, $
y `
.
'...'
las comillas simples escapan a todos los caracteres menos a sí mismo.
POSIX conchas
Los shells POSIX se comportan principalmente como el shell Bourne, excepto que:
ksh
como POSIX excepto que:
{string}
es especial si la cadena contiene una sin comillas ,
(o ..
en algunos casos y con algunas versiones).
- ksh93 tiene un operador de cotización especial adicional:
$'...'
con reglas complejas. Ese operador se encuentra también (con algunas variaciones) en bash
, zsh
, mksh
y FreeBSD y busybox sh
.
ksh93
también tiene un $"..."
operador de cotización 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 $"..."
.
bash
como ksh93
pero:
- En las configuraciones regionales de caracteres de un solo byte, todos los caracteres en blanco (según la configuración regional) se consideran delimitadores (como espacio o tabulación). En efecto, eso significa que debe citar todos los bytes con el octavo bit establecido en caso de que puedan ser un carácter en blanco en algún entorno local.
- Cuando la expansión del historial de csh está habilitada, como en las instancias interactivas,
!
es especial en algunos contextos y las comillas dobles no siempre se le escapan. Y ^
es especial al comienzo de un comando.
zsh
como ksh93
pero:
- misma nota que para la
bash
expansión del historial de csh
=
es especial como el primer caracter de una palabra (se =ls
expande a /bin/ls
).
{
y }
también puede abrir y cerrar grupos de comandos cuando no están delimitados (como en {echo text}
trabajos como el de Bourne { echo text;}
).
- excepto
[
solo, [
necesidades citadas incluso si no se cierra con un ]
.
- Con la
extendedglob
opción activada, #
, ^
y ~
son comodines operadores.
- Con la
braceccl
opción, {non-empty-string}
es especial.
$"..."
no es apoyado.
- como peculiaridad especial,
?
no es especial cuando se sigue un %
(incluso citado o expandido) al comienzo de una palabra (para permitir la %?name
especificación del trabajo)
- una
rcquotes
opción (no habilitada por defecto) le permite a uno ingresar comillas simples como ''
dentro de comillas simples à la rc
(ver más abajo).
yash
como POSIX
excepto eso.
- Todos los caracteres en blanco se consideran delimitadores.
- Con la
brace-expand
opción, implementa la expansión de llaves de estilo zsh.
Para todos los shells, hay algunos contextos especiales donde las citas funcionan de manera diferente. Ya hemos mencionado aquí documentos y backticks, pero también hay [[...]]
en ksh y algunos otros shells, POSIX $((...))
, case
construcciones ...
También tenga en cuenta que las citas 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 palabras reservadas y afecta la expansión de alias.
Resumen
En los shells tipo Bourne !#$^&*?[(){}<>~;'"`\|=
, SPC, TAB, NEWLINE y algunos bytes con el conjunto de 8 bits son o pueden ser especiales (al menos en algunos contextos).
Para eliminar el significado especial para que sean tratados literalmente, utilice comillas.
Utilizar:
'...'
para eliminar el significado especial de cada personaje:
printf '%s\n' '\/\/ 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 a \
se pasa literalmente a printf
. Los otros son tratados por el shell como delimitadores de token.
- utilizar
"..."
citar caracteres sin impedir la expansión de parámetros ( $var
, $#
, ${foo#bar}
...), expansión aritmética ( $((1+1))
también $[1+1]
en algunas conchas) y la sustitución de comandos ( $(...)
o la forma de edad `...`
. En realidad, la mayoría de las veces, lo hace desea poner esas expansiones en el interior comillas dobles en cualquier caso . Puede usar \
dentro "..."
para eliminar el significado especial de los caracteres que aún son especiales (pero solo ellos).
Si la cadena contiene '
caracteres, todavía se puede utilizar '...'
para el descanso y utilizar otros mecanismos de cotización que se pueden citar '
como "'"
o \'
o (si está disponible) $'\''
:
echo 'This is "tricky", isn'\''t it?'
Use la $(...)
forma moderna de sustitución de comandos. Solo use el viejo `...`
para compatibilidad con el shell Bourne, es decir, para un sistema muy viejo, y solo en asignaciones variables, como en no usar:
echo "`echo "foo bar"`"
Que no funcionará con el shell Bourne o las versiones AT&T de ksh. O:
echo "`echo \"foo bar\"`"
Que funcionará con Bourne y AT&T ksh, pero no con yash
, pero usa:
var=`echo "foo bar"`; echo "$var"
que funcionará con todos.
Anidarlos de forma portátil con comillas dobles también es imposible, así que de nuevo, use variables. También tenga cuidado con el procesamiento especial de barra invertida:
var=`printf '%s\n' '\\'`
Almacenará solo una barra invertida en el interior $var
, porque hay un nivel adicional de procesamiento de barra invertida (para \
, `y $
(y también "
cuando se cita excepto en yash
)) dentro de las barras de retroceso, por lo que necesita
var=`printf '%s\n' '\\\\'`
o
var=`printf '%s\n' '\\\'
en lugar.
Familia csh
csh y tcsh tienen una sintaxis significativamente diferente, aunque todavía hay mucho en común con el shell Bourne, ya que comparten una herencia común.
Caracteres especiales:
"\'&|;()^`<>$
, space, newline y tab son especiales en todas partes cuando no se citan.
#
(csh es el shell que se introdujo #
como líder de comentarios) es especial al comienzo de un script o después de un espacio, tabulación o nueva línea sin comillas.
*?[
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 (de nuevo, una invención csh), y las reglas de citas son especiales.
~
(la expansión de tilde también es una invención de csh) es especial en algunos contextos.
Operadores de cotizaciones
Son los mismos que para el shell Bourne, pero el comportamiento difiere. 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 más o menos funcional de csh.
\
escapa a un solo carácter, excepto la nueva línea (igual que para el shell Bourne). Es el único operador de citas que puede escapar !
. \<newline>
no se escapa, pero lo transforma de un separador de comandos a un separador de tokens (como el espacio)
"..."
escapa todos los caracteres excepto a sí misma, $
, `
, nueva línea y !
. Contrariamente al shell Bourne, no puede usar \
para escapar $
y `
adentro "..."
, pero puede usar \
para escapar !
o nueva línea (pero no en sí mismo, excepto cuando antes de una !
o nueva línea). Un literal !
es "\!"
y un literal \!
es "\\!"
.
'...'
escapa a todos los caracteres excepto a sí mismo !
y a la nueva línea. Al igual que para las comillas dobles, !
y la nueva línea se puede escapar con una barra diagonal inversa.
- la sustitución de comandos solo se realiza a través de la
`...`
sintaxis y difícilmente se puede usar de manera confiable.
- La sustitución de variables también está bastante mal diseñada y es propensa a errores. Un
$var:q
operador ayuda a escribir código más confiable que involucra variables.
Resumen
Manténgase alejado de csh si puede. Si no puedes usar:
- comillas simples para citar la mayoría de los personajes.
!
y Newline todavía necesita a \
.
\
puede escapar de la mayoría de los personajes
"..."
puede permitir algunas expansiones dentro de él, pero eso es bastante defectuoso si incrustan caracteres de nueva línea y / o barra diagonal inversa, lo mejor es usar comillas simples y $var:q
para expansión variable. Tendrá que usar bucles si desea unir elementos de una matriz de manera confiable.
rc
familia
rc
es el plan9
shell y tiene gusto de sus descendientes es
y akanga
se ha portado a Unix y me gusta de Unix. Es un shell con una sintaxis mucho más limpia y mejor y la que todos usarían si no estuviéramos atascados con los shells tipo Bourne para una compatibilidad con versiones anteriores.
rc
/ /akanga
Caracteres especiales
#;&|^$=`'{}()<>
, SPC, TAB y NEWLINE siempre son especiales cuando no se citan.
*?[
son operadores obsesivos.
Operador de cotización
'...'
es el único operador de cotización. Se '
escribe un literal con ''
comillas simples como en:
echo 'it''s so simple isn''t it?'
es
es
podría verse como un shell experimental basado en rc
.
Sin embargo, tiene algunas diferencias. El de interés para este 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 ...
pescado
El pez es un recién llegado (circa 2005), está destinado 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 expansión pid) como una diferencia significativa de otros shells, y `
no es especial)
#
(comentario) especial cuando se sigue un espacio sin comillas, tabulación, nueva línea o ;&|^<>
*?
(pero no [...]
) operadores globales
Operadores de cotizaciones
\
cita un solo carácter especial, excepto la nueva línea, pero tenga en cuenta que también funciona como un introductor de secuencia de escape C ( \n
, \b
...). IOW, \n
no es una cita n
sino una nueva línea.
"..."
cita todo menos a sí mismo, $
y la barra invertida y la barra invertida pueden usarse para escapar de ellas. \<newline>
es una continuación de línea (eliminada) dentro "..."
.
'...'
cita todo menos a sí mismo y \
puede usar la barra invertida para escapar de ellos.
=
,@
y%
son especiales en algunos shells en algunos contextos.