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

Bash-Scripting:Wechsel vom Backtick-Operator zu $-Klammern

Es gibt bestimmte Befehle oder Tricks, die Sie als Systemadministrator verwenden, die Sie einfach in Ihr Arsenal einbauen und nie wirklich aufhören, alle Optionen oder Alternativen dazu eingehend zu analysieren.

Einer dieser Tricks ist für mich der Backtick-Operator. Ich habe es ziemlich häufig benutzt, als ich in Perl programmiert habe (was ich heutzutage nicht mehr benutze, aber es scheint immer noch einen treuen Fanclub zu haben - überprüfen Sie diese Umfrage). In meinen Perl-Skripten würde ich den Backtick-Operator verwenden, um einen Befehl im Betriebssystem auszuführen und die Ausgabe zurückzugeben, um die Logik im Skript fortzusetzen.

[Das könnte Ihnen auch gefallen: Bash-Skripting:So schreiben Sie Daten in Textdateien]

Der Backtick-Operator ist auch in Shell-Skripten verfügbar, und weil er so einfach mit anderen Befehlen kombiniert werden kann, habe ich angefangen, ihn häufig zu verwenden. Es gibt jedoch einen "empfohleneren" Weg, dasselbe zu tun, indem Sie $ verwenden parens (Klammern)-Operator.

In diesem Artikel zeige ich Ihnen die Vor- und Nachteile der einzelnen für die Verwendung in Shell-Skripten.

Die grundlegende Funktionalität von Backticks

Die Open Group hat eine Definition für den Backtick-Operator, die offiziell als Befehlssubstitution bezeichnet wird. Dieser Operator ist nicht das einfache Anführungszeichen, sondern ein anderes Zeichen, das als gravierender Akzent bekannt ist (` ).

Die Idee ist einfach:

❯ echo "There are `ls | wc -l` files in this directory"
There are 3 files in this directory

Ich habe eine sehr einfache Gruppe von Befehlen, ls | wc -l die ich verwende, um die Anzahl der Dateien im aktuellen Verzeichnis aufzulisten und zu zählen. Ich kann das ganz einfach interaktiv machen und genau sehen, was das Ergebnis ist. Dann kann ich es in mein Haupt-echo einbetten Befehl.

In einem Shell-Skript könnte ich sicherlich dasselbe tun, indem ich das Ergebnis meines count-Befehls einer Variablen zuweise und die Variable dann später verwende.

❯ file_count=`ls | wc -l`
❯ echo "There are $file_count files in this directory"
There are 3 files in this directory

Und natürlich wäre es besser, wenn die Idee der Wiederverwendung wäre der Wert oder ob die auszuführende Operation nicht so einfach war wie in meinem Beispiel.

Das Einbetten der Befehle mit Backticks würde ich als "schnelle und schmutzige Tricks" klassifizieren.

Die $ Klammern

Sie können dasselbe Ergebnis erzielen, indem Sie die Backticks durch $ ersetzen Klammern, wie im Beispiel unten:

❯ echo "There are $(ls | wc -l) files in this directory"
There are 3 files in this directory

Hier ist ein weiteres Beispiel, immer noch sehr einfach, aber etwas realistischer. Ich muss etwas beheben in meinen Netzwerkverbindungen, also beschließe ich, meine gesamten und wartenden Verbindungen Minute für Minute anzuzeigen.

❯ cat netinfo.sh
#!/bin/bash
while true
do
  ss -an > netinfo.txt
  connections_total=$(cat netinfo.txt | wc -l)
  connections_waiting=$(grep WAIT netinfo.txt | wc -l)
  printf "$(date +%R) - Total=%6d Waiting=%6d\n" $connections_total $connections_waiting
  sleep 60
done

❯ ./netinfo.sh
22:59 - Total=  2930 Waiting=   977
23:00 - Total=  2923 Waiting=   963
23:01 - Total=  2346 Waiting=   397
23:02 - Total=  2497 Waiting=   541

Es scheint nicht riesig zu sein Unterschied, oder? Ich musste nur die Syntax anpassen. Nun, es gibt einige Implikationen zwischen den beiden Ansätzen. Wenn Sie wie ich sind, der automatisch die Backticks verwendet, ohne zu blinken, lesen Sie weiter.

Einstellung und Empfehlungen

Einstellung klingt wie ein schlechtes Wort, und in vielen Fällen ist es möglicherweise wirklich schlecht.

Als ich die Erklärungen für den Backtick-Operator recherchierte, fand ich einige Diskussionen über „Sind die Backtick-Operatoren veraltet?“

Die kurze Antwort lautet:Nicht im Sinne von „kurz davor, unterstützungslos zu werden und aufhören zu arbeiten“. Backticks sollten jedoch vermieden und durch $ ersetzt werden Parens-Syntax.

Die Hauptgründe dafür sind (in keiner bestimmten Reihenfolge):

1. Backticks-Operatoren können chaotisch werden, wenn die internen Befehle ebenfalls Backticks verwenden.

  • Sie müssen die internen Backticks mit Escapezeichen versehen, und wenn Sie einfache Anführungszeichen als Teil der Befehle oder als Teil der Ergebnisse verwenden, kann das Lesen und die Fehlerbehebung des Skripts schwierig werden.
  • Wenn Sie anfangen, über Verschachtelung nachzudenken Backtick-Operatoren innerhalb anderer Backtick-Operatoren funktionieren die Dinge nicht wie erwartet oder überhaupt nicht. Mach dir keine Sorgen.

2. Das $ parens-Operator ist sicherer und vorhersehbarer.

  • Was Sie in $ codieren parens-Operator wird als Shell-Skript behandelt. Syntaktisch ist es dasselbe, als hätte man diesen Code in einer Textdatei, also können Sie davon ausgehen, dass alles, was Sie in einem isolierten Shell-Skript schreiben würden, hier funktionieren würde.

Hier sind einige Beispiele für die Verhaltensunterschiede zwischen Backticks und $ Klammern:

❯ echo '\$x'
\$x

❯ echo `echo '\$x'`
$x

❯ echo $(echo '\$x')
\$x

Hier finden Sie weitere Beispiele für die Unterschiede zwischen Backticks und $ Elternverhalten hier.

[ Kostenloser Spickzettel:Holen Sie sich eine Liste von Linux-Dienstprogrammen und -Befehlen zum Verwalten von Servern und Netzwerken. ] 

Abschluss

Wenn Sie die beiden Ansätze vergleichen, erscheint es logisch zu denken, dass Sie immer/nur den $ verwenden sollten Eltern-Ansatz. Und Sie könnten denken, dass die Backtick-Operatoren nur von Systemadministratoren aus einer älteren Ära verwendet werden.

Nun, das mag stimmen, da ich manchmal Dinge verwende, die ich vor langer Zeit gelernt habe, und in einfachen Situationen kodiert mein „Muskelgedächtnis“ es einfach für mich. Bei Ad-hoc-Befehlen, von denen Sie wissen, dass sie keine unangenehmen Zeichen enthalten, können Sie Backticks verwenden. Aber für alles, was beständiger oder komplexer/ausgefeilter ist, verwenden Sie bitte das $ Elternansatz.


Linux
  1. Bash-Scripting(I)

  2. Verhindern, dass ein Bash-Skript gleichzeitig ausgeführt wird

  3. .bashrc aus aktueller Shell neu generieren?

  4. So vergleichen Sie Zeichenfolgen in Bash Shell-Skripten

  5. Gibt es eine goto-Anweisung in bash?

Bash-Skripting – Case-Statement

Bash-Scripting:So lesen Sie Daten aus Textdateien

Abkehr von Windows – Es beginnt

Bash-Skripting (II)

Bash-Scripting(III)

Gibt es eine Möglichkeit, Benachrichtigungen vom Bash-Skript in Ubuntu anzuzeigen?