2010-08-16 18 views
14

Gegeben:Woher weiß Bash, wo meine Variablennamen enden?

myvar=Hello 
  • echo $myvar -> Zeigt Hello (fein bisher)
  • echo $myvar#world -> zeigt Hello#world (warum ich dachte, es hier beschweren würde, dass keine solche Variable myvar#world genannt ist?)
  • echo ${myvar#world} -> zeigt nur Hello (wieder, warum?)
+1

oops, wusste das nicht. Habe jetzt einige akzeptiert, indem ich auf das Häkchen geklickt habe. – sunny8107

Antwort

22

Der zweite Fall teilt sich in drei Teile:

[echo] [$myvar][#world] 
1  2  3 

Teil 1 wird der Befehl, 2 Teil ein Parameter ist, und ein Teil 3 ist ein String-Literal. Der Parameter stoppt auf r seit den # kann nicht Teil des Variablennamen sein (# 's sind nicht in Variablennamen erlaubt.)

Der Shell-Parser den Anfang eines Parameternamen durch die $ erkennen, und die endet mit einem beliebigen Zeichen, das nicht Teil des Variablennamens sein kann. Normalerweise sind nur Buchstaben, Zahlen und Unterstriche in einem Variablennamen zulässig, alles andere teilt der Shell mit, dass Sie den Namen der Variablen eingegeben haben.

Alle diese werden $myvar von sechs wörtlichen Zeichen gefolgt ausdrucken:

echo $myvar world 
echo $myvar?world 
echo $myvar#world 

Wenn Sie Zeichen setzen wollen, die nach dem Parameter direkt Teil eines Parameters sein können, können Sie Klammern um den Parameternamen enthalten , wie folgt aus:

myvar=hello 
echo ${myvar}world 

die ausdruckt:

helloworld 

Ihr dritter Fall ist substring removal, außer ohne Übereinstimmung. Um es etwas Interessantes zu tun, versuchen Sie stattdessen:

myvar="Hello World" 
echo ${myvar#Hello } 

die gerade World druckt.

+0

Ich habe den zweiten Teil, im ersten Fall, es ist immer noch Drucken der #, so ist die Ausgabe Hallo # Welt anstelle von Hallo Welt – sunny8107

+0

Macht die Bearbeitung es klarer? – Douglas

6

Variablen können kein "#" enthalten, daher weiß die Shell, dass sie nicht Teil einer Variablen ist.

Das Konstrukt $ {myvar # Welt} ist eigentlich ein String Manipulator unten erklärt:

# ist actuially ein String Modifikator, den ersten Teil der String-Matching "Welt" wird entfernen. Da es keine String-Welt in myvar passend ist nur echos zurück ist „Hallo“

Verwandte Themen