¿Cómo puedo escapar de las comillas dobles dentro de una cadena doble en Bash?
Por ejemplo, en mi script de shell
#!/bin/bash
dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"
No puedo obtener la ENCLOSED BY '\"'
comilla doble para escapar correctamente. No puedo usar comillas simples para mi variable, porque quiero usar variable $dbtable
.
$dbtable
, existe un riesgo. Sin embargo, esto sería muy poco común, ya que los usuarios finales no suelen utilizar SSH en una máquina para cargar sus datos.Respuestas:
Use una barra invertida:
fuente
x=ls; if [ -f "$(which "\""$x"\"")" ]; then echo exists; else echo broken; fi;
da roto mientras que... [ -f "$(which $x)" ]; ...
o... [ -f $(which "$x") ]; ...
funciona bien. Surgirían problemas cuando cualquiera$x
o el resultado de$(which "$x")
dar algo con un espacio u otro carácter especial. Una solución alternativa está utilizando una variable para contener el resultadowhich
, pero ¿bash es realmente incapaz de escapar de una cita o estoy haciendo algo mal?grep -oh "\"\""$counter"\""\w*"
como parte de una sintaxis bash donde in$counter
es una variable. no le gusta ningún pensamientoUn ejemplo simple de comillas de escape en el shell:
Se realiza al terminar uno ya abierto (
'
), colocar el que se escapó (\'
) y luego abrir otro ('
).Alternativamente:
Se realiza al terminar uno ya abierto (
'
), colocar una cita en otra cita ("'"
) y luego abrir otra ('
).Más ejemplos: Escapar de comillas simples dentro de cadenas de comillas simples
fuente
echo "abc\"abc"
es suficiente para producirabc"abc
como en la respuesta de Peter.No sé por qué este viejo problema apareció hoy en las listas etiquetadas de Bash, pero solo en el caso de futuros investigadores, tenga en cuenta que puede evitar escapar utilizando códigos ASCII de los caracteres que necesita hacer eco.
Ejemplo:
\x22
es el código ASCII (en hexadecimal) para comillas dobles y\x27
comillas simples. Del mismo modo, puedes hacer eco de cualquier personaje.Supongo que si intentamos hacer eco de la cadena anterior con barras invertidas, necesitaremos un eco desordenado de dos filas con barra invertida ... :)
Para la asignación variable, este es el equivalente:
Si la variable ya está establecida por otro programa, aún puede aplicar comillas dobles / simples con sed o herramientas similares.
Ejemplo:
fuente
echo 'export PS1='\[\033[00;31m\]${?##0}$([ $? -ne 0 ] && echo \x22 \x22)\[\033[00;32m\]\u\[\033[00m\]@\[\033[00;36m\]\h\[\033[00m\][\[\033[01;33m\]\d \t\[\033[00m\]] \[\033[01;34m\]\w\n\[\033[00m\]$( [ ${EUID} -ne 0 ] && echo \x22$\x22 || echo \x22#\x22 ) '' >> ~/.profile
Bash te permite colocar cadenas adyacentes, y terminarán pegadas.
Así que esto:
produce
El truco consiste en alternar entre cadenas de comillas simples y dobles, según sea necesario. Desafortunadamente, rápidamente se vuelve muy desordenado. Por ejemplo:
produce
En su ejemplo, lo haría algo como esto:
que produce el siguiente resultado:
Es difícil ver lo que está pasando aquí, pero puedo anotarlo usando comillas Unicode. Lo siguiente no funcionará en bash: es solo para ilustración:
dbload=
'load data local infile "
' “'gfpoint.csv'
” '" into
' “table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '
” '"
' “' LINES
” 'TERMINATED BY "
' “'\n'
” '" IGNORE 1 LINES
'Bash interpretará las citas como "''" en lo anterior. Las comillas como
" '
terminarán en la variable resultante.Si le doy el mismo tratamiento al ejemplo anterior, se ve así:
$ echo
“I like to use
”'
"double quotes"
'“
sometimes
”fuente
Echa un vistazo a printf ...
Sin usar printf
Salida: di "hola"
Usando printf
Salida: di \ "hola \"
fuente
printf
escapa más personajes, como'
,(
y)
printf %q
genera cadenas listas paraeval
, no formateadas paraecho -e
.printf
con un uso inútil deecho
. Ambos ejemplos han roto las citas. La solución adecuada es comillas dobles de la variable.Almacene el carácter de comillas dobles como variable:
Salida:
fuente
Haga uso de $ "cadena".
En este ejemplo, sería,
Nota (de la página del manual ):
fuente
Agregue
"\"
antes de la comilla doble para escapar, en lugar de\
fuente
csh
respuesta a unabash
pregunta? Los dos son completamente distintos e incompatibles.