Richtige variable Parsen und Zitat in Bash

Richtige variable Parsen und Zitat in Bash

Falsches Zitieren im ursprünglichen Quellcode kann leicht zu Fehler führen, wenn die von den Benutzern bereitgestellten Eingaben nicht wie erwartet oder nicht einheitlich sind. Im Laufe der Zeit kann ein unvorhergesehener Nebeneffekt einer fälschlicherweise zitierten Variablen zu einem Fehler führen. Dies ist umso wichtiger für Sicherheitsanwendungen, die anfällig für Hacking -Versuche sind. Erfahren Sie, wie Sie von Anfang an ordnungsgemäß das Zitieren und Variablen analysieren/validieren, und vermeiden Sie viele dieser Probleme! Lass uns anfangen…

In dieser Tutorial -Serie lernen Sie:

  • So zitieren Sie Ihre Bash -Variablen richtig
  • Die Vorbehalte und Ergebnisse des falschen Zitierens
  • Wie man variable Werte sicherstellt, sollen sie sein
  • So überprüfen Sie nach leeren, numerischen und textbasierten Variablenwerten
Richtige variable Parsen und Zitat in Bash

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Linux-Verteilungsunabhängige
Software BASH -Befehlszeile, Linux -basiertes System
Andere Jedes Dienstprogramm, das standardmäßig nicht in der Bash -Shell enthalten ist sudo apt-Get Installieren Sie den Dienstprogramm (oder yum anstelle von APT-Get)
Konventionen # - Erfordert, dass Linux -Commands mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mithilfe von verwendet werden sudo Befehl
$-erfordert, dass Linux-Commands als regulärer nicht privilegierter Benutzer ausgeführt werden

Beispiel 1: Zitieren Sie diese Variablen!

Es sei denn, Sie arbeiten mit numerischen Werten, und selbst in diesem Fall ist es ratsam, Ihre textbasierten Variablen bei der Überprüfung auf Gleichheit usw. immer zu zitieren. Schauen wir uns ein Beispiel an:

$ Var1 = "a"; if [$ var1 == "a"]; dann wieder echo 'ja!'; Fi ja! $ Var1 =; if [$ var1 == "a"]; dann wieder echo 'ja!'; Fi Bash: [: ==: Unary Operator erwartet 


Zuerst setzen wir Var1 zum Wert A und anschließend überprüft, ob Var1 geliefert A. Das hat funktioniert, und wir mögen denken. Einige Zeit später und nach vielen Codesänderungen sehen wir jedoch Bash: [: ==: Unary Operator erwartet erwartet - Eine etwas kryptische Nachricht, die uns sagt, dass mit unserem Code etwas nicht stimmt.

Der Grund ist im zweiten Beispiel gezeigt. Wenn unsere Variable irgendwie leer ist, ich.e. Hat nicht richtig eingestellt (oder wurde seitdem gelöscht), dann wird wir mit einem Fehler dargestellt, da Bash dies effektiv liest if [== "a"] Welches ist eine Aussage, die nicht viel Sinn macht, und sie kann nicht berechnet.

Wenn wir unsere Variable richtig mit doppelten Zitaten zitiert haben ("), das würde nicht passieren:

$ Var1 =; if ["$ var1" == "a"]; dann wieder echo 'ja!'; fi $ 

Diesmal las Bash die Erklärung als Wenn ["" == "a"] - Eine Aussage sowohl leichter für die Augen als auch der Bash -Compiler. Es wird keine Ausgabe als eindeutig erzeugt, als ein leerer String nicht dem Buchstaben entspricht A.

Beispiel 2: Einflüssiges Zitieren etwas weiter

Sobald Sie schon eine Weile mit Bash gearbeitet haben, lernen Sie einige seiner Sprachproduktion. Ein solcher Idiom ist das - nennen wir es Privileg (und es ist sicherlich eine Bequemlichkeit!) - Um numerische Variablen zitieren zu können, auch wenn eine numerische Operation ausgeführt wird:

$ Var1 = 13; if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; Fi ja! $ Var1 = 7; if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi 

Obwohl Var1 auf einen numerischen Wert eingestellt ist, akzeptiert Bash die " Zitieren von Var1 und korrekt das Ergebnis der IF -Anweisung mit der Anweisung erzeugen ist gleich (ich.e. -Gl) Vergleichsvorgang.

Dennoch haben wir noch keinen Kreis erreicht, da die folgenden noch immer fehlschlägt

$ Var1 =; if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; Fi Bash: [:: ganzzahliger Ausdruck erwartet 

Diesmal wird ein ganzzahliger Ausdruck erwartet, aber eine leere Variable (i.e. "" " wurde bestanden), und dies ist sicherlich nicht numerisch. Gibt es eine Möglichkeit, dies zu beheben?? Sicher:

Beispiel 3: Überprüfung auf Nulllänge

$ Var1 =; if [-n "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; fi $ var1 = 13; if [-n "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; Fi ja! 

Hier verwenden wir eine Vorprüfung, um festzustellen, ob die Variable keine Länge von Null hat, indem die bedingte Anweisung verwendet wird -N was bedeutet, dass Die Zeichenfolge hat keine Länge von Null. Dies könnte auch gegen die Rückwärtsgut durch die Verwendung getauscht werden ! -z Wo -z bedeutet Die Zeichenfolge hat eine Länge von Null und das ! Negiert das gleiche, ich.e. kehrt das Ergebnis um:

$ Var1 =; Wenn [ ! -z "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; fi $ var1 = 13; Wenn [ ! -z "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; Fi ja! $ Var1 = 7; Wenn [ ! -z "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; fi $ 


Wir haben auch das hinzugefügt = 7 Beispiel hier, um zu zeigen, wie die Wenn Anweisungen funktionieren korrekt. Testen Sie immer Ihre Wenn Aussagen und Bedingungen in verschiedenen Situationen, Anwendungsfällen und allgemeinen Ausnahmen (schlechte Werte, kein Wert, ungerade Werte usw.) Wenn Sie sicherstellen möchten, dass Ihr Code frei von Fehler ist.

Beispiel 4: Ein fast vollständiger Scheck

Es gibt immer noch einen Mangel im letzten Beispiel. Hast du es abgeholt?? Grundsätzlich, wenn wir Textwerte an die Zeichenfolge übergeben oder Wenn Aussage schlägt immer noch fehl:

$ Var1 = "a"; Wenn [ ! -z "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; Fi Bash: [: A: Ganzzahler Ausdruck erwartet 

Dies kann durch die Verwendung einer Unterschale überwunden werden, Grep, und einige regelmäßige Ausdrücke. Weitere Informationen zu regulären Ausdrücken finden Sie in unseren Bash Regexps für Anfänger mit Beispielen und erweiterten Bash Regex mit Beispielenartikeln. Weitere Informationen zu Bash -Unterschalen finden Sie in unseren Linux -Subschalen für Anfänger mit Beispielen und erweiterten Linux -Subschalen mit Beispielenartikeln.

Die Syntax ist nicht zu komplex:

$ Var1 = 7; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; fi $ var1 = 13; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; Fi ja! $ Var1 = "a"; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; fi $ 

Großartig. Hier überprüfen wir den Inhalt von Var1 numerisch sein mit a grep -o (nur Grep; ich.e. Grep Nur der Teil der Suchzeichenfolge, der in diesem Fall ein regulärer Ausdruck ist). Wir wählen ein beliebiges Zahlenzeichen aus 0-9 und das ein oder mehrmals (wie durch die angegeben \+ Qualifikation zum [0-9] Auswahlbereich). Dann versuchen wir, dies zu entsprechen Grep passte nur einen Teil Text gegen die ursprüngliche Variable. Ist es gleich? Wenn ja, dann besteht unsere Variable nur aus Zahlen.

Wenn wir unsere äußere erweitern Wenn Erklärung ein wenig, um eine einzuschließen anders Klausel, die uns mitteilen, ob eine Variable nicht numerisch ist und wann wir versuchen, einzugeben 'A' Als Eingabe sehen wir, dass die verschiedenen Eingänge jeweils richtig analysiert werden;

$ Var1 = 7; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; sonst echo 'variable nicht numerisch!'; fi $ var1 = 13; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; sonst echo 'variable nicht numerisch!'; Fi ja! $ Var1 = "a"; if ["$ (echo" $ var1 "| grep -o '[0-9] \+')" == "$ var1"]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; sonst echo 'variable nicht numerisch!'; FI -Variable nicht numerisch! 


Jetzt haben wir also eine perfekte Zeile für unseren Code, nein? Nein ... wir vermissen immer noch etwas ... siehst du was?

Beispiel 5: Eine vollständige Überprüfung

Hast du das Problem gesehen?? Wir haben noch keine leere Variable überprüft!

$ Var1 = "; if [" $ (echo "$ var1" | grep -o '[0-9] \+') "==" $ var1 "]; dann if [" $ var1 "-eq 13]; dann wiederhole 'ja!'; fi; sonst echo 'variable nicht numerisch!'; Fi Bash: [:: ganzzahliger Ausdruck erwartet 

Autsch. Ich vertraue inzwischen, inzwischen sehen Sie, warum ich in meinen Artikeln regelmäßig erwähne, Ihre Code -Kreationen immer auf die eine oder andere Weise zu überprüfen. Sicher, Bash eignet sich für schnelles und einfaches Scripting. Wenn Sie jedoch sicherstellen möchten. Das Fix ist einfach:

$ Var1 = "; wenn [ ! -z "$ var1" -a "$ (echo" $ var1 "| grep -o '[0-9] \+')") "==" $ var1 "]; dann if ["$ var1" -Eq 13]; dann wieder echo 'ja!'; fi; sonst echo 'variable nicht numerisch!'; FI -Variable nicht numerisch! 

Hier verwenden Sie die Faust Wenn Anweisung fügen wir eine zusätzliche Bedingung für Variable hinzu Var1 etwas nicht (!) Seien Sie eine Längenvariable mit Null. Dies funktioniert angesichts des aktuellen Setups als zweiter Teil der ersten gut Wenn Die Aussage kann immer noch unabhängig vom Inhalt von fortgesetzt werden Var1.

Abschluss

In diesem Artikel haben wir uns angesehen, wie man Variablen richtig zitiert und analysiert/bewertet, und untersucht, wie komplex es war, eine perfekte Variable -Überprüfung des Bash -Codes zu schreiben. Wenn Sie lernen, wie man diese Dinge von Anfang an richtig macht.

Genießen Sie diese Variablen und zitieren Sie doppelt! 🙂

Verwandte Linux -Tutorials:

  • Liste der besten Kali -Linux -Tools für Penetrationstests und…
  • Umgang mit Benutzereingaben in Bash -Skripten
  • Verschachtelte Schleifen in Bash -Skripten
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Advanced Bash Regex mit Beispielen
  • GDB -Debugging -Tutorial für Anfänger
  • Mastering -Bash -Skriptschleifen beherrschen
  • Spezielle Bash -Variablen mit Beispielen
  • Python reguläre Ausdrücke mit Beispielen
  • So verwenden Sie Bash -Unterschalen im Inneren, wenn Anweisungen