2015-09-16 23 views
5

Wewnątrz pętli pętli odczytu przeczytam, że widzę tę zmienną ekspansję ${line/device name:}. Próbowałem uruchomić skrypt z moim własnym plikiem wejściowym i po prostu wypisuje linię.Rozszerzenie zmiennej bash za pomocą '/'

Czy możesz mi powiedzieć, co robi ta ekspansja?

+0

Obie odpowiedzi są poprawne, ale tutaj jest dokumentacja dotycząca rozbudowy parametrów do wglądu i edycji w odpowiedzi: http://www.gnu.org/software/bash/manual/html_node/ Shell-Parameter-Expansion.html –

Odpowiedz

4

Zmienna nazwa to line./służy do zamiany ciągów znaków, czyli "nazwa urządzenia:", jeśli istnieje gdziekolwiek w $line została usunięta.

> line="a device name: some name" 
> echo ${line/device name:} 
a some name 

Można również zobaczyć # i % podstawienia, które stoją na substytucji w line początek i koniec. Należy również pamiętać, że takie zastąpienie / jest specyficzne dla basha (np. ash go nie obsługuje, % i # są pozornie przenośne), więc powinieneś użyć #!/bin/bash zamiast #!/bin/sh jako hashbang na początku skryptu.

+0

'%' i '# 'są rzeczywiście przenośne, będąc [częścią specyfikacji powłoki POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02). – chepner

+0

Dziękuję. Doskonała odpowiedź! – Jimbo

4

Zwraca $line z usuniętym podciąganiem device name:. Na stronie atakujących człowieka:

${parameter/pattern/string} 
     Pattern substitution. The pattern is expanded to produce a pattern just as in 
     pathname expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. If pattern begins with /, all 
     matches of pattern are replaced with string. Normally only the first match is 
     replaced. If pattern begins with #, it must match at the beginning of the 
     expanded value of parameter. If pattern begins with %, it must match at the 
     end of the expanded value of parameter. If string is null, matches of pattern are deleted and the/following pattern may be omitted. If parameter is @ or 
     *, the substitution operation is applied to each positional parameter in turn, 
     and the expansion is the resultant list. If parameter is an array variable 
     subscripted with @ or *, the substitution operation is applied to each member 
     of the array in turn, and the expansion is the resultant list. 
+0

Dziękuję. Doskonała odpowiedź! – Jimbo