2011-07-07 19 views
12

Quiero algo como esto en bash:cotizaciones de anidación en fiesta

alias foo='bar="$(echo hello world | grep \"hello world\")"; echo $bar;'; foo 

Resultados previstos: hola mundo

salida de la señal: grep: mundo ": No existe el fichero o directorio

  • Las citas externas tienen que ser comillas simples, con comillas dobles $ bar estarían vacías

  • T Las siguientes citas tienen que ser comillas dobles, con comillas simples $() no se expandirían.

  • Las comillas internas pueden ser de ambos tipos de comillas, pero las comillas simples no permiten comillas simples dentro de ellas.

¿Cómo consigo esto?

Respuesta

32

las cosas dentro $() representa un subnivel, por lo que se les permite colocar comillas dobles ONU-escapado dentro

alias foo='bar="$(echo testing hello world | grep "hello world")"; echo "$bar"' 
1

escape en los espacios

alias foo='bar="$(echo hello world | grep hello\ world)"; echo $bar;' 
+0

¿Es no es posible escapar de las comillas, digamos que quiero hacer: 'alias foo = 'baz =" hello world "; bar = "$ (echo hello world | grep \" $ baz \ ")"; echo $ bar; '; foo' – Tyilo

5

Es un poco claro qué "algo como esto" significa, pero la forma más sencilla de lograr lo que parece ser el punto aquí es una función simple:

foo() { 
    echo 'hello world' | grep 'hello world' 
} 
foo 
  • No hay necesidad de una asignación de variable intermedia (se perderá de todos modos).
  • Las funciones son generalmente preferidas sobre los alias debido a la mayor flexibilidad (manejo de parámetros) y la legibilidad (varias líneas, menos escapatoria).
  • Siempre use la solución más simple que podría funcionar.
0

Las comillas dobles $() no son necesarios:

alias foo='bar=$(echo hello world | grep "hello world"); echo $bar;' 
foo 

# Output: 
hello world