Wie man richtig Nest Bash Backticks
Frage
verpasst Entweder ich etwas Spiel oder backlashing scheint nicht zu Arbeit mit zu viel Programmierer-quote-Looping.
$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"
hello1-hello2-hello3-echo hello4
Gesucht
hello1-hello2-hello3-hello4-hello5-hello6-...
Lösung
Verwenden $(commands)
statt:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
$(commands)
tut das Gleiche wie Backticks, aber Sie können Nest sie.
Sie können auch in Bash Programmerweiterungen interessiert sein:
echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
Andere Tipps
Wenn Sie auf die Verwendung Backticks bestehen, folgendes getan werden könnte
$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
Sie müssen Schrägstriche, \\ \\\\ \\\\\\\\
von 2x setzen und so weiter, es ist einfach sehr hässlich, Verwendung $(commands)
wie andere vorgeschlagen.
Jedes Mal, wenn Sie wollen einen Befehl Verwendung command substitution
bewerten:
$(command)
Jedes Mal, wenn Sie eine arithmetischen Ausdruck Verwendung expression substitution
bewerten:
$((expr))
Sie können Nest diese wie folgt aus:
Lassen Sie uns sagen file1.txt 30 Zeilen lang und file2.txt ist 10 Zeilen lang, als Sie einen Ausdruck wie diese auswerten kann:
$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))
das würde die Ausgabe 20 (die Differenz in der Anzahl der Zeilen zwischen zwei Dateien).
Es ist viel einfacher, wenn Sie bash $(cmd)
Befehl Substitution Syntax , die ist viel freundlicher zu verschachtelt werden:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
Manchmal Graviszeichen Verschachtelung kann mit xargs
und Rohren substituiert sein
$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4
Nachteil dieser Lösung ist:
- Alle Argumente müssen in umgekehrter Reihenfolge zur Verfügung gestellt werden (4 ? 1);
-
Alle Argumente werden Raum (auflösbar mit
tr
) getrennt:$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-' hello1-hello2-hello3-hello4
Lassen Sie sich zeigt, einen echten Anwendungsfall.
Nach den Befehlen in der Bash arbeiten, aber nicht in tcsh (Graviszeichen Verschachtelung ist nicht sehr gut in tcsh behandelt)
$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``
Sie können substituiert sein
$ which bash | xargs dirname | xargs ls