Por ejemplo:
me$ FOO="BAR * BAR"
me$ echo $FOO
BAR file1 file2 file3 file4 BAR
y usando el \
carácter de escape:
me$ FOO="BAR \* BAR"
me$ echo $FOO
BAR \* BAR
Obviamente estoy haciendo algo estúpido.
¿Cómo obtengo la salida BAR * BAR
?
Citar cuando la configuración $FOO
no es suficiente. También debe citar la referencia de variable:
me$ FOO="BAR * BAR"
me$ echo "$FOO"
BAR * BAR
RESPUESTA CORTA
Como han dicho otros, siempre debe citar las variables para evitar comportamientos extraños. Así que use echo "$ foo" en lugar de solo echo $ foo .
RESPUESTA LARGA
Creo que este ejemplo merece más explicaciones porque hay más cosas de lo que parece a primera vista.
Puedo ver dónde entra tu confusión porque después de que ejecutaste tu primer ejemplo, probablemente pensaste que obviamente el shell está haciendo lo siguiente:
Entonces, desde tu primer ejemplo:
Después de la expansión del parámetro es equivalente a:
Y después de la expansión del nombre de archivo es equivalente a:
Y si solo escribe
echo BAR * BAR
en la línea de comando, verá que son equivalentes.Entonces probablemente pensaste "si escapo del *, puedo evitar la expansión del nombre de archivo"
Entonces, de tu segundo ejemplo:
Después de la expansión del parámetro debe ser equivalente a:
Y después de la expansión del nombre de archivo debe ser equivalente a:
Y si intenta escribir "echo BAR \ * BAR" directamente en la línea de comando, imprimirá "BAR * BAR" porque el escape impide la expansión del nombre de archivo.
Entonces, ¿por qué el uso de $ foo no funcionó?
Es porque hay una tercera expansión que se lleva a cabo: la eliminación de cotizaciones. De la eliminación manual de cotizaciones bash es:
Entonces, lo que sucede es que cuando escribe el comando directamente en la línea de comando, el carácter de escape no es el resultado de una expansión anterior, por lo que BASH lo elimina antes de enviarlo al comando echo, pero en el segundo ejemplo, el "\ *" era el resultado de una expansión previa de parámetros, por lo que NO se elimina. Como resultado, echo recibe "\ *" y eso es lo que imprime.
Tenga en cuenta la diferencia entre el primer ejemplo: "*" no se incluye en los caracteres que se eliminarán mediante Quote Removal.
Espero que esto tenga sentido. Al final, la conclusión es la misma: solo use comillas. Solo pensé en explicar por qué escapar, que lógicamente debería funcionar si solo funciona la expansión de parámetro y nombre de archivo, no funcionó.
Para obtener una explicación completa de las expansiones de BASH, consulte:
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions
fuente
Agregaré un poco a este viejo hilo.
Usualmente usarías
Sin embargo, he tenido problemas incluso con esta sintaxis. Considere el siguiente script.
Se
*
debe pasar literalmente acurl
, pero surgirán los mismos problemas. El ejemplo anterior no funcionará (se expandirá a nombres de archivo en el directorio actual) y tampoco lo hará\*
. Tampoco puede cotizar$curl_opts
porque se reconocerá como una opción única (no válida) paracurl
.Por lo tanto, recomendaría el uso de la
bash
variable$GLOBIGNORE
para evitar la expansión del nombre de archivo por completo si se aplica al patrón global, o usar elset -f
indicador incorporado.Aplicando a su ejemplo original:
fuente
SELECT * FROM etc.
esta es la única forma en que funciona.fuente
fuente
Puede valer la pena acostumbrarse a usar en
printf
lugar deecho
en la línea de comando.En este ejemplo, no ofrece muchos beneficios, pero puede ser más útil con resultados más complejos.
fuente