Albo brakowało mi jakiegoś luzu, albo luzowanie nie wydaje się działać przy zbyt dużej zapętleniu cytowań programisty.
$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"
hello1-hello2-hello3-echo hello4
Chciał
hello1-hello2-hello3-hello4-hello5-hello6-...
deprecated
Dlatego należy używać backticks$(cmd)
.Odpowiedzi:
Użyj
$(commands)
zamiast tego:$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" hello1-hello2-hello3-hello4
$(commands)
robi to samo, co grawerunki, ale możesz je zagnieżdżać.Możesz być także zainteresowany rozszerzeniami serii Bash:
echo hello{1..10} hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
źródło
jeśli nalegasz na używanie odwrotnych apostrofów, możesz wykonać następujące czynności
$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
musisz wstawić odwrotne ukośniki,
\\ \\\\ \\\\\\\\
przez 2x i tak dalej, jest to po prostu bardzo brzydkie, użyj$(commands)
jak inne sugerowane.źródło
Za każdym razem, gdy chcesz ocenić polecenie, użyj
command substitution
:$(command)
Za każdym razem, gdy chcesz ocenić wyrażenie arytmetyczne, użyj
expression substitution
:Możesz zagnieżdżać te w ten sposób:
Powiedzmy, że plik1.txt ma 30 linii, a plik2.txt 10 linii, niż możesz ocenić takie wyrażenie:
co zwróci 20 (różnica w liczbie wierszy między dwoma plikami).
źródło
Jest o wiele łatwiej, jeśli używasz
$(cmd)
składni podstawiania poleceń basha , która jest znacznie bardziej przyjazna dla zagnieżdżania:$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" hello1-hello2-hello3-hello4
źródło
Czasami zagnieżdżanie odwrotne można zastąpić
xargs
rurami i$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 hello1 hello2 hello3 hello4
Wadą tego rozwiązania są:
Wszystkie argumenty zostaną oddzielone spacjami (możliwe do rozwiązania za pomocą
tr
):$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-' hello1-hello2-hello3-hello4
Pokażmy prawdziwy przypadek użycia.
Następujące polecenia działają w bash, ale nie w tcsh (zagnieżdżanie lewych apostrofów nie jest obsługiwane zbyt dobrze w tcsh)
$ ls $(dirname $(which bash)) $ ls `dirname \`which bash\``
Można je zastąpić
$ which bash | xargs dirname | xargs ls
źródło