2010-04-17 16 views
63

Albo przegapiłem jakiś luz lub luz nie wydaje się działać ze zbyt dużą ilością pętli programatora.Jak poprawnie zagnieździć tył Basha

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

hello1-hello2-hello3-echo hello4 

Poszukiwane

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

Pytanie powinno prawdopodobnie brzmieć "Jak używać rekurencyjnie backbaków Bash". To powinno pomóc tym pracownikom Googlerskim. –

+0

co to jest, co próbujesz zrobić.? to w ogóle nie ma znaczenia. – ghostdog74

+1

@joey, tytuł zmieniony, mile widziane: D – Stormenet

Odpowiedz

103

użytkowania $(commands) Zamiast:

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

$(commands) robi to samo co backticks, ale można je zagnieździć.

Możesz być także zainteresowany Bash ekspansji zakres:

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

+1, podobnie jak {1..10}. Ograniczyć go za pomocą tablicy? ZSH może "$ {$ (data) [2,4]}". Dlaczego nie: "echo $ {echo hello1 - $ (echo hello2) [1]}"? – hhh

7

To jeśli używasz bash na $(cmd)command substitution syntax, który jest znacznie bardziej przyjazne są zagnieżdżone dużo łatwiejsze:

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

Nie ogranicza się to do * bash *. Jest dostępny we wszystkich powłokach zgodnych z POSIX 1003.1 ("powłoki POSIX") i większości powłok pochodzących z Bourne'a (* ksh *, * ash *, * dash *, * bash *, * zsh *, itp.), Choć nie aktualna powłoka Bourne'a (np. http://heirloom.sourceforge.net/sh.html). –

22

jeśli nalegać, aby korzystać odwrócone, pojedyncze apostrofy, Poniżej można zrobić

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

trzeba umieścić backslashy, \\ \\\\ \\\\\\\\ przez 2x i tak na, to po prostu bardzo brzydki, użyj $(commands), jak sugerowali inni.

+0

To faktycznie odpowiada na pytanie – Justas

8

każdym razem chcesz ocenić użyć polecenia command substitution:

$(command) 

każdym razem, gdy chcesz ocenić arytmetyczną używając wyrażenia expression substitution:

$((expr)) 

Można zagnieździć je tak:

Powiedzmy, że plik1.txt ma długość 30 linii, a plik2.txt ma długość 10 linii, niż można ocenić wyrażenie takie jak to:

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

która wyświetli wynik 20 (różnica w liczbie linii między dwoma plikami).