GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Deklarationssyntax für die Befehlssubstitution in Bash – Welche dieser beiden ist die bessere Vorgehensweise?

Für diese Frage gibt es hier bereits Antworten :Was ist der Unterschied zwischen $(stuff) und `stuff`?

(6 Antworten)
Vor 6 Jahren geschlossen.

Dies ist Teil eines bash find Schleife, und ich fragte mich, welche die korrektere Syntax ist und warum?

filename="$(echo "$i" | cut -c5-)";
filename=`echo "$i" | cut -c5-`;

Beide dienen dazu, den Dateinamen zu erhalten.

Akzeptierte Antwort:

Das Bash-Handbuch stellt Folgendes fest:

Die POSIX $()-Form der Befehlsersetzung ist implementiert (siehe Befehlsersetzung) und wird der Bourne-Shell vorgezogen (die ebenfalls aus Gründen der Abwärtskompatibilität implementiert ist).

Also $(...) wird gegenüber `...` bevorzugt in allem, was Sie neu und Bash-spezifisch schreiben¹. Die Backtick-Ersetzung lässt sich nicht gut verschachteln (Sie müssen ihnen entkommen) und hat ein etwas seltsames Zitierverhalten. Sie können $(... $(...) ...) verschachteln beliebig viel ohne Ausgabe. Das Handbuch beschreibt das Verhalten der beiden wie folgt:

Wenn die Backquote-Ersetzungsform im alten Stil verwendet wird, behält der umgekehrte Schrägstrich seine wörtliche Bedeutung, außer wenn ihm „$“, „`“ oder „“ folgt. Das erste Backquote ohne vorangestellten Backslash beendet die Befehlsersetzung. Bei Verwendung der $(Befehl)-Form bilden alle Zeichen zwischen den Klammern den Befehl; keine werden besonders behandelt.

Es wird normalerweise als bewährte Methode angesehen, alle Zeichenfolgenerweiterungen in Anführungszeichen zu setzen, um Probleme mit der Worttrennung zu vermeiden, auch an Stellen, an denen dies nicht unbedingt erforderlich ist, also "$(...)" ist auch hier eine bessere Vorgehensweise.

Zum Schluss noch zwei relevante Teile von derselben Wooledge-Seite:

  • Es ist auch an der Zeit, `...` zu vergessen . Es stimmt nicht mit der Syntax von Expansion überein und ist ohne eine Dosis Schmerzmittel furchtbar schwer zu verschachteln. Verwenden Sie $(...) stattdessen.
  • Und um Himmels willen:„Benutze mehr Anführungszeichen!“ Schützen Sie Ihre Zeichenfolgen und Parametererweiterungen vor Wortspaltung. Wortspaltung wird Ihre Babys auffressen, wenn Sie Dinge nicht richtig zitieren.

¹Eigentlich sogar in POSIX sh Skripte, diese gelten als Best Practice. Es gibt immer noch schwächere Granaten, aber du wirst wissen, ob du ihnen begegnen wirst.


Linux
  1. Zitieren innerhalb von $ (command Substitution) in Bash?

  2. Befehlsersetzung mit „?

  3. Welche Bash wird ausgeführt?

  4. Bash-Exportbefehl

  5. Exit-Code der Variablenzuweisung zur Befehlsersetzung in Bash

Bash Heredoc

Welcher Linux-Befehl

Bash-Quellbefehl

Verlaufsbefehl in Linux (Bash-Verlauf)

Bash-printf-Befehl

Bash-Skripting (II)