2012-05-25 9 views
10

Chcę pobrać n-ty parametr $ @ (lista parametrów wiersza poleceń przekazanych do skryptu), gdzie n jest przechowywane w zmiennej.

Próbowałem $ {$ n}.

Na przykład, chcę uzyskać 2nd parametr wiersza poleceń z inwokacją:

./my_script.sh alpha beta gamma 

A indeks nie powinny być jawne, ale przechowywany w zmiennej n.

źródłowego:

n=2 
echo ${$n} 

spodziewałbym wyjście jako "beta", ale pojawia się błąd:

./my_script.sh: line 2: ${$n}: bad substitution 

Co robię źle?

+1

To jest duplikatem. To samo pytanie tutaj: http://stackoverflow.com/questions/1497811/how-to-get-the-nth-positional-argument-in-bash –

Odpowiedz

8

Spróbuj tego:

#!/bin/bash 
args=("[email protected]") 
echo ${args[1]} 

dobrze zastąpić „1” z pewnego $ n lub coś ...

27

Można użyć zmiennej o zmiennej wartości . Jest to niezależne od tablic i działa dobrze w swoim przykładzie:

n=2 
echo "${!n}" 

Edit:zmiennej zadnie mogą być wykorzystane w wielu sytuacjach. Jeśli istnieje zmienna foobar, następnie dwa następujące zmienne ekspansje produkują ten sam wynik:

$foobar 

name=foobar 
${!name} 
+0

Dzięki. Jestem pewien, że to też działa, ale nie rozumiem dlaczego. Dlaczego "nic wspólnego z tablicami" ?! Czy $ @ a list (a nie tablica)? –

+0

@gojira Wydaje mi się, że nosid wskazuje na to, że nie trzeba nawet kopiować listy argumentów osobno, i można po prostu odwoływać się do niego za pomocą zmiennej orientacji –

+1

@gojira: '$ @' jest podobne do tablicy. Wyrażenie '$ {! N}' w tej odpowiedzi jest interpretowane jako '$ 2', gdy' n' to 2. –

3

przenośna (specyficzny wobec atakujących) roztwór

$ set a b c d 
$ n=2 
$ eval echo \${$n} 
b 
+0

@gojira: Powinieneś/powinnaś zdawać sobie sprawę z [implikacji związanych z bezpieczeństwem] (http://mywiki.wooledge.org/ BashFAQ/048). –

2

eval może pomóc ci pośrednio uzyskać dostęp do zmiennej, co oznacza dwukrotną ocenę wyrażenia.

Można zrobić jak ten eval alph=\$$n; echo $alph

6

Poniżej działa zbyt:

#!/bin/bash 
n=2 
echo ${@:$n:1} 
+0

Znak dolara przed n można pominąć. –

Powiązane problemy