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-...
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top