2011-07-01 7 views
3

私は変数名N_fooN_barを構築し、以下にその値を使用したい:Bashで変数名を作成するには?

#!/bin/bash 
N_foo=2 
N_bar=3 
for i in { "foo" "bar" } 
do 
    for j in { 1..$(`N_$i`) } 
    do 
     echo $j 
    done 
done 

私は2つの内部ループでN_fooN_barの値を使用し、1、2、1をプリントアウトしたいです、 2、3である。正しい構文は何ですか?

この出力を与える
var="foo" 
nfoo=1 
ref=n${var} 
echo $ref 
echo ${!ref} 

+0

最初に、内側の '{' '}を外側から削除し、内側ループの' {} 'の隣のスペースを削除する必要があります。 'echo {1..3}'はあなたが望むものを生成しません。 – Lynch

+0

配列はこの種の "評価"地獄を避ける最善の方法です。実際に何をしようとしていますか? –

答えて

5
#!/bin/bash 
N_foo=2 
N_bar=3 
for i in "foo" "bar" 
do 
    key="N_${i}" 
    eval count='$'$key 
    for j in `seq 1 $count` 
    do 
     echo $j 
    done 
done 
+0

'eval'はこの種の問題に対する古典的な解決策です。 –

+0

@Computist:この回答に対して行った編集を拒否しました。答えはあなたが求めている '$ {!symbol}'構文を使用しませんでした。あなたの編集は本当に新しい質問です。新しい質問を表示しない場合は、回答ではなく自分の質問を編集する必要があります。 –

+0

内部ループは必要ないことに注意してください。 'seq 1 $ count'で十分です。 – a3nm

3

あなたは、間接変数の参照演算子を使用することができます

nfoo 
1 
+0

しかしそれでも解決できません。 –

+0

Ignacio:そうですね、forループ範囲の中括弧で使用したときに期待したように動作しませんでした。 {1 .. $ {!var}}は、私が思うように範囲を作成しませんでした。 – sashang

5
#!/bin/bash 
N_foo=2 
N_bar=3 
for i in "foo" "bar" 
do 
    i2="N_$i" 
    seq 1 ${!i2} 
done 
+0

受け入れられた答えよりもはるかに優れています。ありがとうございました。 – dimitarvp

+0

"良い"とは分からない - 'seq'は移植性がなく、POSIXで指定されず、bashの一部として含まれていません。 –

0

私は、次のコードを使用して終了しました。それはパラメータ置換技術(c.f. http://tldp.org/LDP/abs/html/parameter-substitution.html)を使用します。

#!/bin/bash 
N_foo=2 
N_bar=3 
for i in "foo" "bar" 
do 
j_max=N_$i 
for ((j=1; j<=${!j_max}; j++)) 
    do 
    echo $j 
    done 
done 

!履歴拡張パラメータ(C.F. http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters)です。 !j_maxは、j_maxに設定された最新の値で置き換えられます(N_foo/N_barの1回目/ 2回目の反復)。次に、1回目/ 2回目の反復で値2/3を持つ${N_foo}/${N_bar}が呼び出されます。

+0

ABSにリンクしないでください。これは、bashのW3Schoolsであり、悪い習慣の例や古くなったコンテンツがたくさんあります。 (bash-hackers 'wiki on indirection)(http://wiki.bash-hackers.org/syntax/pe#indirection)、または[BashFAQ#6](http://mywiki.wooledge.org/BashFAQ/ 006)。 –

関連する問題