2010-10-13 11 views
16

Jeśli mam zmienną zawierającą Niecytowany dolara, czy jest jakiś sposób mogę powtórzyć całą zawartość zmiennej?Jak echo zmienną zawierającą Niecytowany dolara w bash

Na przykład coś wywołuje skrypt:

./script.sh "test1$test2"

a następnie, jeśli chcę użyć parametru robi "obcięty" tak:

echo ${1}
test1

oczywiście jedno- cytowanie nazwy zmiennej nie pomaga. Nie mogę wymyślić, jak ją zacytować, aby móc samemu uniknąć znaku dolara, gdy skrypt otrzyma parametr.

Odpowiedz

7

Zmienna otrzymuje przed uruchomieniem skryptu.

./script.sh 'test1$test2' 
+0

Tak, to wydaje się być przypadek :) – Not22

+0

Są też inne sytuacje, choć gdzie faktycznie mają zmienne z Niecytowany znaki dolara, jak gdy czytam dane z plików. Następnie chcę wywołać mój skrypt z tymi danymi, więc czy jest to moja jedyna opcja, aby przetrzeć cały plik przed jego odczytaniem? – Not22

+1

Odczytywanie danych z plików nie zastępuje zmiennych. –

28

Problemem jest to, że skrypt otrzymuje „test1” na pierwszym miejscu i nie może wiedzieć, że istnieje odniesienie do pustej zmiennej (na czarno). Musisz uciec $ przed przekazaniem go do skryptu, tak:

./script.sh "test1\$test2" 

Albo apostrofów ' tak:

./script.sh 'test1$test2' 

W takim przypadku bash nie będzie rozszerzać zmienne z tym łańcuchu parametrów .

0

Jak powiedział Ignacio, zmienna zostanie zastąpiona, więc twoje skrypty uzyskają ./script.sh test1 jako wartości dla $0 i $1.

Ale nawet w przypadku, gdy użył dosłownych cytatów przekazać argument shoudl zawsze zacytować "$1" w echo "${1}". To jest dobra praktyka.

+0

A szelki są * nie * potrzebne, ponieważ jest to proste podstawienie. –

+0

tak, nie są potrzebne. Używanie ich jest opcjonalne. – Benoit

4

za pomocą apostrofów, meta znaki takie jak $ zachowają swoją wartość dosłowne. Jeśli używane są podwójne cudzysłowy, nazwy zmiennych zostaną interpolowane.

Powiązane problemy