2010-08-16 2 views
14

Dane:W jaki sposób bash wie, gdzie kończą się moje nazwy zmiennych?

myvar=Hello 
  • echo $myvar -> Pokazuje Hello (fine tej pory)
  • echo $myvar#world -> pokazuje Hello#world (dlaczego myślałem, że skarżą się, że tu nie ma takiej zmiennej o nazwie myvar#world?)
  • echo ${myvar#world} -> pokazuje tylko Hello (znowu, dlaczego?)
+1

oops, nie wiedziałem tego. Przyjąłem niektóre teraz, klikając znacznik wyboru. – sunny8107

Odpowiedz

22

Drugi przypadek dzieli się na trzy części:

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

Część 1 jest komenda, część 2 jest parametrem, a część 3 to literał łańcuchowy. Parametr zatrzymuje się na r od # nie może być częścią nazwy zmiennej (# 's nie są dozwolone w nazwach zmiennych.)

Parser powłoka rozpoznaje początek nazwy parametru przez $ i Koniec przez dowolny znak, który nie może być częścią nazwy zmiennej. Zwykle tylko litery, cyfry i podkreślenia są dozwolone w nazwie zmiennej, wszystko inne powie powłoce, że skończysz, określając nazwę zmiennej.

Wszystko to będzie wydrukować $myvar zakończony sześcioma dosłownych znaków:

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

Jeśli chcesz umieścić znaki, które mogą być częścią parametru bezpośrednio po parametrze można zawierać nawiasy wokół nazwy parametru coś takiego:

myvar=hello 
echo ${myvar}world 

który wypisuje:

helloworld 

Twój trzeci przypadek to substring removal, z wyjątkiem braku dopasowania. Aby zrobić coś interesującego, spróbuj zamiast tego:

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

, która właśnie drukuje World.

+0

Dostałem drugą część, w pierwszym przypadku, nadal jest drukowanie #, więc wyjście to Hello # world zamiast Hello world – sunny8107

+0

Czy edycja czyni to jaśniejszym? – Douglas

6

zmienne nie mogą zawierać "#", więc powłoka wie, że nie jest częścią zmiennej.

Konstrukt # $ {myvar świat} rzeczywiście jest manipulator ciąg poniżej:

# jest actuially modyfikator ciąg, który usunie pierwszą część „świata” dopasowywania strun. Ponieważ nie ma ciąg dopasowania świat w myVar to tylko echo back „hello”