2012-01-22 11 views
11

ja newbie w bash scripting ale nie uderstand dlaczego to nie działaString w bash - złe błąd podstawienie

#!/bin/bash 
foo=foobarfoobar 
echo ${foo//bar/baz} 

złe błąd podstawienie linii 3

+0

To działa dobrze na moim powłoki. Jaka jest twoja domyślna powłoka? –

+0

Jeśli próbujesz dokonać zamiany, zastępując pasek bazami, jest to poprawne. Działa na moim komputerze, drukując foobazfoobaz, z bashem 3.2.48. –

+0

GNU bash, wersja 4.2.10 (1) - działa w linii poleceń, ale nie w skrypcie. – Aristarhys

Odpowiedz

48

Ta zmiana działa dobrze w Bash 4.2.8 (i wygląda dobrze zgodnie z do zrobienia dokumentacja).

Moim zdaniem, najprawdopodobniej nie używasz Basha - jak wywołujesz scenariusz? Jeśli robisz sh script.sh, możesz uruchomić go z Dash'em lub czymś podobnym (a Dash rzeczywiście wprowadza błąd podstawiania w linii 3). Spróbuj jawnie uruchomić go za pomocą Bash (bash script.sh).

Jeśli okaże się, że faktycznie za pomocą Dash, istnieje kilka przydatnych informacji na temat różnic i jak wrócić do korzystania z Basha (jeśli chcesz) tutaj: https://wiki.ubuntu.com/DashAsBinSh

+0

GNU bash, wersja 4.2.10 (1) -release – Aristarhys

+0

jeśli robię to samo w linii poleceń to działa – Aristarhys

+0

Piszę test basha i zaczyna pracę – Aristarhys

-1
$ foo=foobarfoobar 
$ echo ${foo}/bar/baz 
foobarfoobar/bar/baz 

Wystarczy, że masz nawiasy w niewłaściwym miejscu, ale nie jestem ekspertem w BASH, więc może to nie jest efekt, do którego zmierzasz.

+0

$ {foo // bar/baz} musi zastąpić wszystkie paski do baz, więc echo będzie foobazfoobaz http://tldp.org/LDP/abs/html/string-manipulation.html – Aristarhys

+2

OP to wykonywanie globalnej substytucji za pomocą '//'. Nie sądzę, że chce dodać 'bar/baz' do swojej zmiennej. Chce zastąpić wystąpienia 'bar' przez' baz', aby jego wynik wyglądał jak "foobazfoobaz" –

+0

tak, w każdym artykule manipulującym ciągiem basha używam takiego kodu, ale to nie działa dla mnie – Aristarhys

Powiązane problemy