2010-04-17 10 views
63

O me perdí un contragolpe o parece que el backlash no funciona demasiado con el programador-quote-looping.Cómo anidar correctamente los bastoncillos de Bash

$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``" 

hello1-hello2-hello3-echo hello4 

Se busca

hello1-hello2-hello3-hello4-hello5-hello6-... 
+0

La pregunta probablemente debería ser "Cómo usar bash Backticks recursivamente". Eso debería ayudar a los Googlers por ahí. –

+0

¿Qué es lo que estás tratando de hacer? esto no tiene ningún significado en absoluto. – ghostdog74

+1

@joey, cambio de título, bienvenido: D – Stormenet

Respuesta

103

Uso $(commands) lugar:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" 
hello1-hello2-hello3-hello4 

$(commands) hace lo mismo que los backticks, pero puede anidarlos.

Usted también podría estar interesado en expansiones Bash:

echo hello{1..10} 
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10 
+0

+1 como {1..10}. ¿Limitarlo con array? ZSH puede "$ {$ (date) [2,4]}". ¿Por qué no? "Echo $ {echo hello1 - $ (echo hello2) [1]}"? – hhh

7

Es mucho más fácil si se utiliza de fiesta $(cmd)command substitution syntax, que es mucho más amigable para ser anidado:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" 
hello1-hello2-hello3-hello4 
+4

Esto no está restringido a * bash *. Está disponible en todos los shells que cumplen con POSIX 1003.1 ("shells POSIX") y la mayoría de los shell derivados de Bourne (* ksh *, * ash *, * dash *, * bash *, * zsh *, etc.) aunque no el shell de Bourne real (es decir, http://heirloom.sourceforge.net/sh.html). –

22

si insiste utilizar acentos abiertos, lo siguiente podría ser hecho

$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``" 

usted tiene que poner las barras invertidas, \\ \\\\ \\\\\\\\ por 2x y así en, es muy feo, use $(commands) como otro sugerido.

+0

Esto realmente responde la pregunta – Justas

8

Cada vez que se desea evaluar el uso de comandos command substitution:

$(command) 

Cada vez que se desea evaluar un uso expresión aritmética expression substitution:

$((expr)) 

Puede anidar éstos así:

Digamos que el archivo1.txt tiene 30 líneas y el archivo2.txt tiene 10 líneas, de lo que puede evaluar una expresión como esta:

$(($(wc -l file1.txt) - $(wc -l file2.txt))) 

que produciría 20 (la diferencia en el número de líneas entre dos archivos).

Cuestiones relacionadas