Heim >php教程 >PHP开发 >Shell-Programmierung: Bash Space Things

Shell-Programmierung: Bash Space Things

高洛峰
高洛峰Original
2016-11-23 12:57:281263Durchsuche

Verstehen Sie zunächst, wann Sie Leerzeichen in der Bash verwenden sollten und wann nicht.

1. Auf beiden Seiten der Gleichheitszeichenzuweisung dürfen keine Leerzeichen stehen.

2. Zwischen Befehlen und Optionen sind Leerzeichen erforderlich.

3 sind optional

Werfen wir einen Blick auf häufige Probleme

1. Bei der Zuweisung gibt es zusätzliche Leerzeichen auf beiden Seiten des Gleichheitszeichens oder nur auf der linken Seite
test@pythontab. com ~ $ var1 = test
bash: var1: Befehl nicht gefunden
test@pythontab.com ~ $ echo ${var1:?error}
bash: var1: error
test@pythontab.com ~ $ echo ${var1?error}
bash: var1: error
test@pythontab.com ~ $ var2 =test
bash: var2: Befehl nicht gefunden
test@pythontab.com ~ $ echo ${var2:?error}
bash: var2: error
test@pythontab.com ~ $ echo ${var2?error}
bash: var2: error

Hier habe ich verwendet Bash-Variablenerweiterung, ${var1:?error}, wenn var1 nicht gesetzt oder null (undefiniert oder leer) ist, wird der angegebene Fehler gemeldet. ${var1?error}Wenn var1 nicht gesetzt ist, wird der angegebene Fehler gemeldet. Den Ausführungsergebnissen nach zu urteilen: Wenn auf der linken Seite des Gleichheitszeichens ein Leerzeichen steht, wird der Variablenname als Befehl ausgeführt und das Ergebnis ist „Befehl nicht gefunden“ und der Variablen wird kein Wert
2. Beim Zuweisen eines Werts ist auf der linken Seite des Gleichheitszeichens kein Leerzeichen und auf der rechten Seite ein Leerzeichen (Diese Situation ist etwas speziell, Sie werden zwei Situationen finden)
test@pythontab .com ~ $ var= test
test@pythontab.com ~ $ var= nocmd
bash: nocmd: Befehl nicht gefunden

Rechts neben dem Gleichheitszeichen befindet sich auch ein Leerzeichen Der erste Befehl meldet keinen Fehler, der zweite Befehl jedoch.

Das liegt daran, dass es eine solche Möglichkeit gibt, Befehle in der Shell auszuführen: var=string command

Der Befehl command erhält den Wert der Variablen var (ob der Wert der Variable var wird nach der Ausführung des Befehls beibehalten. Sie wird in bash4 beibehalten, aber sie wurde beibehalten, als ich sie in Dash fand. Da test ein Befehl ist und nocmd nicht, habe ich berichtet Befehl nicht gefunden.
test@ pythontab.com ~ $ var=newtest eval echo $var
newtest
test@pythontab.com ~ $ echo $var

Hinweis: Ich habe hier eval verwendet Um den ersten Fehler zu vermeiden, wird beim Parsen $var durch eine leere Zeichenfolge ersetzt. Andernfalls tritt die folgende Situation auf (das Folgende ist die falsche Testmethode. Bevor Echo ausgeführt wird, wurde $var durch eine leere Zeichenfolge ersetzt) ​​

Code wie folgt:
test@pythontab.com ~ $ var=newtest echo $var
test@pythontab.com ~ $ echo $var

An diesem Punkt glaube ich, dass es jeder versteht Für das Gleichheitszeichen dürfen auf der linken und rechten Seite keine Leerzeichen stehen, aber das ist definitiv nicht das gewünschte Ergebnis.

3. Zwischen dem Befehl und der Option muss ein Leerzeichen stehen

Jeder scheint das zu verstehen, warum bin ich immer noch so wortreich? Apropos, ich muss einen ganz besonderen Befehl erwähnen: [Befehl (Sie haben richtig gelesen, es ist [), das ist der Testbefehl (natürlich ist dies in Bash ein integrierter Befehl, aber er hat keine Auswirkungen

unser Verständnis). Vielleicht kommt Ihnen der [Befehl bekannt vor, ja, ich garantiere Ihnen, dass Sie ihn gesehen haben, schauen Sie sich das folgende Beispiel an
test@pythontab.com ~ $ if [ "abc" = "abc" ]; 'sie sind gleich'; fi
sie sind gleich
test@pythontab.com ~ $ type -a [
[ ist eine eingebaute Shell
[ ist /usr/bin/[

Erinnern Sie sich? [Befehle werden oft in if-Urteilen verwendet. Natürlich schreiben manche Leute gerne so:
test@pythontab.com ~ $ [ "abc" = "cba" ] || >sie sind nicht gleich
test@pythontab.com ~ $ type -a [
[ ist eine eingebaute Shell
[ ist /usr/bin/[

[ Der Befehl wird aufgerufen Testbefehl, beide sind fast gleich, warum also nicht genau gleich? Werfen wir einen Blick darauf
test@pythontab.com ~ $ [ "abc" = "cba"
bash: [: fehlendes `]'
test@pythontab.com ~ $ [ "abc" = "cba " ]
test@pythontab.com ~ $ test "abc" = "cba" ]
bash: test: zu viele Argumente
test@pythontab.com ~ $ test "abc" = "cba „

Um es klarzustellen: Wenn Sie den [Befehl, müssen Sie ihm einen Schwanz geben] verwenden, können Sie bei Verwendung des Testbefehls keinen Schwanz hinzufügen. Tail] ist [der letzte Parameter, ein unverzichtbarer Parameter, der das Ende des Befehls darstellt

So viel ist gesagt, was hat das mit Leerzeichen zu tun? Um es allen verständlich zu machen, möchte ich zunächst Folgendes sagen: [Es handelt sich um einen Befehl in der Shell, und um ihn herum müssen Leerzeichen stehen! ] ist der letzte unverzichtbare Parameter von [, der ebenfalls Leerzeichen auf beiden Seiten erfordert (obwohl die Parameter einiger Befehle miteinander verbunden werden können, wie z. B. ps, der Befehl [ jedoch nicht, es müssen Leerzeichen zwischen seinen Parametern stehen). Werfen wir einen Blick auf [häufige Fehler

a. Fehlendes Leerzeichen zwischen if und [
test@pythontab.com ~ $ if[ "$HOME" = "/home/igi"];then echo ' equal'; fi
bash: Syntaxfehler bei unerwartetem Token `then'
test@pythontab.com ~ $ if[ "$HOME" = "/home/igi" ];then echo 'equal'; 🎜>bash: Syntaxfehler bei unerwartetem Token `then'
test@pythontab.com ~ $ if["$HOME" = "/home/igi"];then echo 'equal'; fi
bash : syntax Fehler in der Nähe des unerwarteten Tokens `then'
test@pythontab.com ~ $ if["$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: Syntaxfehler in der Nähe des unerwarteten Tokens ` dann'

Syntaxanalysefehler, offensichtlich, wenn[ Für Bash weiß ich nicht, was zum Teufel ist

b Es fehlt ein Leerzeichen zwischen [ und den folgenden Parametern
test@pythontab.com ~ $ if [" $HOME" = "/home/igi" ];then echo 'equal'; fi
bash: [/home/igi: Keine solche Datei oder kein solches Verzeichnis
test@pythontab.com ~ $ if [ "$HOME" = "/home/igi"];dann echo 'equal'; fi
bash: [/home/igi: Keine solche Datei oder kein solches Verzeichnis

["$HOME" Für bash, Ich weiß auch nicht, was zum Teufel es ist

c Es gibt einen Platzmangel zwischen den Parametern zwischen [ ]
test@pythontab.com ~ $ if [ "abc"="abc" ] ; then echo 'equal' ; fi
equal
test@pythontab.com ~ $ if [ "abc"="cba" ]; then echo 'equal'; Der erste Befehl scheint richtig zu sein (eigentlich ist es nur ein Zufall). Schauen Sie sich den zweiten Befehl an. „abc“ und „cba“ sind offensichtlich unterschiedlich, werden aber als gleich beurteilt. Dies liegt daran, dass zwischen den Parametern kein Platz vorhanden ist und der Befehl [den internen Wert nur als Wert betrachtet. Werfen Sie einen Blick auf den folgenden Befehl und Sie werden erleichtert sein
test@pythontab.com ~ $ if [ 0 ], then echo 'equal'; "1" ]; then echo 'equal'; fi
equal
test@pythontab.com ~ $ if [ "" ]; then echo 'equal'; [ ] ; then echo 'equal'; fi

Wenn es in [ ] nur einen Wert gibt (die aufgrund fehlender Leerzeichen werden auch gezählt), ist es wahr, wenn es sich nicht um eine leere Zeichenfolge handelt . Daher müssen die Parameter zwischen [ ] auch Leerzeichen auf beiden Seiten haben und können nicht übereinander gestapelt werden

d Es fehlt an Leerzeichen zwischen Parametern und Ende]

Dies wird nicht wortreich sein , tail] Es ist auch der Parameter von [Befehl. Wie oben erwähnt, müssen zwischen Parametern Leerzeichen stehen

Es wird so viel über [Befehl und Leerzeichen] gesprochen, aber manchmal kann es auch ohne Leerzeichen korrekt ausgeführt werden. Das sind natürlich nur Sie. Viel Glück, werfen wir einen Blick darauf
test@pythontab.com ~ $ var=' abc'
test@pythontab.com ~ $ if [$var = "abc" ]; then echo 'equal'; fi
equal
test@pythontab.com ~ $ if ["$var" = "abc" ];then echo 'equal'; fi
bash: [ abc: command not gefunden

double Was in Anführungszeichen eingeschlossen ist, ist ein Ganzes, und wenn keine doppelten Anführungszeichen vorhanden sind, werden die Leerzeichen oder Tabulatoren vor und nach der Zeichenfolge abgeschnitten. Wenn Sie darauf stoßen oder absichtlich Leerzeichen oder Tabulatoren vor und nach der Zeichenfolge verwerfen möchten, ist dies nicht unmöglich, es wird jedoch dringend davon abgeraten, dies zu schreiben, da Ihr Code dadurch sehr fragil wird.

Oder Sie haben alle Leerzeichen hinzugefügt, die Sie hinzufügen sollten, erhalten aber immer noch eine Fehlermeldung. Dies kann auch daran liegen, dass doppelte Anführungszeichen fehlen. Diese Situation kommt sehr häufig vor. Werfen Sie schließlich einen Blick auf
test@pythontab.com ~ $ var=''
test@pythontab.com ~ $ if [ "$var" = "abc" ];then echo 'equal'; fi
test@pythontab.com ~ $ if [ $var = "abc" ];then echo 'equal'; fi
bash: [: =: unärer Operator erwartet
test@pythontab .com ~ $ dvar='a b c'
test@pythontab.com ~ $ if [ $dvar = "a b c" ];then echo 'equal'; fi
bash: [: too much arguments
test@ pythontab.com ~ $ if [ "$dvar" = "a b c" ];then echo 'equal'; fi
equal

Ich werde mich noch einmal ausführlich äußern, lassen Sie die doppelten Anführungszeichen nicht weg leicht. Ist es klar? Wenn Sie es immer noch nicht verstehen,

Abschließend werde ich keinen Unsinn über die optionalen Leerzeichen auf beiden Seiten des Rohrs reden, denn ich habe niemanden getroffen, der daran Zweifel hat.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn