2012-05-25 8 views
10

Bir değişkende saklandığı $ @ 'nin n-th parametresini (komut dosyasına iletilen komut satırı parametrelerinin listesi) almak istiyorum.

$ {$ n} numaralı ürününü denedim.

Örneğin, ben bir çağırma 2 komut satırı parametresini almak istiyorum:

./my_script.sh alpha beta gamma 

Ve endeks açık ama değişken n saklanan olmamalıdır.

Sourcecode:

n=2 
echo ${$n} 

Ben çıktı "beta" olmasını beklediğiniz, ama hata alıyorum:

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

yanlış yapıyorum?

+1

Bu kopyası. Aynı soru burada: http://stackoverflow.com/questions/1497811/how-to-get-the-nth-positional-argument-in-bash –

cevap

27

değişken indirmeyi kullanabilirsiniz. Bu diziler bağımsızdır, ve örnekte gayet iyi çalışıyor:

n=2 
echo "${!n}" 

Düzenleme:Değişken indirection durumlarda bir çok kullanılabilir. Değişken foobar varsa, o zaman şu iki değişken açılımlar aynı sonucu üretmek:

$foobar 

name=foobar 
${!name} 
+0

Teşekkürler. Eminim bu da işe yarıyor ama nedenini anlamıyorum. Neden "dizilerle ilgisi yok" ?! $ @ A listesi (dizi değil)? –

+0

@gojira Nosid'in yaptığı nokta, argümanların listesini ayrı ayrı kopyalamanıza bile gerek olmadığının ve sadece değişken dolaylı bir şekilde –

+1

@gojira kullanılarak başvuruda bulunabileceğidir: '$ @' diziye benzer. Bu cevaptaki '$ {! N}' ifadesi 'n' 2 olduğunda 2 $ 'olarak yorumlanır. –

3

taşınabilir (non-bash spesifik) çözeltisi

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

@gojira: [Güvenlik çıkarımları]' nın farkında olmalısınız (http://mywiki.wooledge.org/ BashFAQ/048). –

2

eval olduğu Değişkeni dolaylı olarak erişmenize yardımcı olabilir, bu da ifadeyi iki kez değerlendirmek anlamına gelir. Aşağıdaki bu eval alph=\$$n; echo $alph

6

gibi yapabilirsiniz

çok çalışır:

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

n'den önceki dolar işareti ihmal edilebilir. –

İlgili konular