2012-01-16 12 views
5

Mam funkcję basha Unix, która wykonuje skrypt analizujący niestandardowe zmienne środowiskowe. Chcę uniknąć eksportowania odpowiednich zmiennych w bashie, a zamiast tego ustawić je tylko dla skryptu, jako część komendy wykonawczej.Ustawianie zmiennych środowiskowych dla skryptu w lokalnej zmiennej funkcji bash

Jeśli ustawię zmienne bezpośrednio w komendzie - np. VARNAME=VARVAL script_name - to działa dobrze. Jednak ponieważ chcę ustawić wiele zmiennych, w oparciu o różne warunki, chcę użyć lokalnej zmiennej funkcji do przechowywania ustawień zmiennych środowiskowych, a następnie użyć tej zmiennej w poleceniu wykonania skryptu. Mam lokalną zmienną "vars", która jest ostatecznie ustawiona, np. Na VARNAME=VAR, ale jeśli spróbuję uruchomić ${vars} script_name z mojej funkcji bash, otrzymam "polecenie nie znaleziono" błąd dla zmiennej zmiennej $ vars - tzn. zawartość $ vars jest interpretowana jako polecenie, a nie jako zmienne środowiskowe.

Próbowałem różnych odmian składni polecenia, ale jak dotąd bez skutku. Obecnie muszę wyeksportować odpowiednie zmienne w funkcji, przed wywołaniem skryptu, a następnie usunąć/zresetować je do poprzednich wartości, ale nie jest to tak naprawdę rozwiązanie, na które miałem nadzieję.

Każda pomoc zostanie bardzo doceniona.

Dzięki Sharon

Odpowiedz

3

Aby ocenić zawartość zmiennych jako wyraz zamiast jako komenda można spróbować użyć eval:

eval ${vars} script_Name 
+0

dziękuję za szybką odpowiedź. Zadziałało :-)! (Rzeczywiście spróbowałem użyć eval w pewnym momencie, ale przypadkowo użyłem niewłaściwej składni). – Sharon

+0

['eval' to zło] (http://mywiki.wooledge.org/BashFAQ/048) – l0b0

2

Jednak, ponieważ chcę, aby ustawić wiele zmiennych, na podstawie różnych warunków , chcę użyć lokalnej zmiennej funkcji do przechowywania ustawień zmiennych środowiskowych , a następnie użyć tej zmiennej w wykonaniu skryptowym n polecenie.

Nie musisz przechowywać zmiennych w oddzielnej zmiennej. można przypisać więcej niż jedną zmienną dla polecenia:

$ cat test.sh 
#!/usr/bin/env bash 
echo "$foo" 
echo "$bar" 
$ foo=abc bar=def ./test.sh 
abc 
def 

Ma to również tę zaletę, że safer than eval.

+1

Nie jestem pewien jak to mi pomaga. Nie wiem z góry, jakie wartości zmiennych należy ustawić dla skryptu. Ustalam to w czasie wykonywania, parsując flagi przekazane do funkcji basha. Dlatego używam zmiennej - aktualizuję zmienną lokalną z przypisaniami zmiennych środowiskowych na podstawie parsowania opcji funkcji, a następnie używam zmiennej lokalnej w wywołaniu skryptu. Ponownie, używanie "eval" do tego działa dobrze. Zauważ, że nie chcę ustawiać zmiennych środowiskowych w wywołaniu funkcji bash, ponieważ chcę używać prostszych flag funkcji. – Sharon