2016-04-06 16 views
1

整数変数を使用して配列名(すなわちArray_1、Array_2、Array _...)を動的に増やすことで、多くの配列変数を反復するループを作成しようとしています。 Array_ $ c)forループ内で(++)を増やすことはできますか?Bashスクリプト1つのループ内でいくつかの配列を繰り返し処理します。

ありがとうございました!

#!/bin/bash 

declare -a Array_1=("Google", "www.google.com") 
declare -a Array_2=("Facebook", "www.facebook.com") 
daclare -a Array_3=("Gmail", "www.gmail.com") 

c=1 

for i in "${Array_$c[@]}"; 

    do 

    #Print name of the Website ($Array_1[0]) 
    #Open link in FF ($Array_1[1]) 
    #Increase the $c, to iterate through the second Array using same loop 
    (c=$c+1) 

    done 

答えて

1

もちろん、あなたが提案する構造でそれを行うことが可能である:

#!/bin/bash 

declare -a Array_1=("Google" "www.google.com") 
declare -a Array_2=("Facebook" "www.facebook.com") 
declare -a Array_3=("Gmail" "www.gmail.com") 

for u in "${[email protected]}"; do 
    onev=${u}[0] 
    twov=${u}[1] 
    echo "$u=${!u}" 
    echo "name of the Website (${!onev})" 
    echo "Link (${!twov})" 
done 

しかし、それは複雑にする必要はありませんこのすべてに:

List of variables: "${[email protected]}" 
Access to one index: "onev=${u}[0]" 
Indirection:   "$u=${!u}" 

このスクリプトは簡単です(と同じジョブについての実行):

#!/bin/bash 
while IFS=$' \t\n' read -r name link; do 
    echo "name of the Website ($name)" 
    echo "    Link ($link)" 
done <<_list_of_sites_ 
Google  www.google.com 
Facebook www.facebook.com 
Gmail  www.gmail.com 
_list_of_sites_ 
+0

ありがとう@BinaryZebra!私はあなたの最初の例を使用しました。 – Impact

+0

@Impactその後、[誰かが私の質問に答えるとどうすればいいですか?](https://stackoverflow.com/help/someone-answers) –

2

この使用法に基づいて、配列は必要ありません。私は代わりにこの方法で書くだろう

$ while read site url; 
    do echo "site:" $site; 
    echo "url:" $url; # do something with url 
    done << EOF 
google www.google.com 
facebook www.facebook.com 
gmail www.gmail.com 
EOF 



site: google 
url: www.google.com 
site: facebook 
url: www.facebook.com 
site: gmail 
url: www.gmail.com 
0

あなたはほとんどそこにいる。

他の変数から変数名を作成する通常の方法は、evalを使用することです。エバールを「悪」と表現する人、避けるべきものがありますが、安全な場面や不可避な状況があります。ここで

は、スクリプトの抜粋に基づいて何か:

#!/bin/bash 

declare -a Array_1=("Google" "www.google.com") 
declare -a Array_2=("Facebook" "www.facebook.com") 
declare -a Array_3=("Gmail" "www.gmail.com") 

for i in {1..3}; do 

    eval printf \"Web site: %s\\n\" \"\${Array_$i[0]}\" 
    eval /usr/local/bin/firefox \"\${Array_$i[1]}\" 

done 

しかし、私は、これはおそらく、それはあなたが達成しようとしているが何であれに間違ったアプローチだと思います。 (?何あなたはとにかく、達成しようとしです:))

+0

お返事ありがとうございました。私はついにシンプルなシェルスクリプトを手に入れました。基本的に私は仕事場で毎朝多くの多くのWebベースのツールを開かなければなりません。だから私は自分のシステムをアップデート/アップグレードし、たくさんの異なったURLを開く単一のシェルスクリプトを書くことに決めました。私は15以上の異なるURL(15以上の変数)を持っていました。私は非常に静的なスクリプトを持っていた。私は、配列内のすべてのインデックスをトラバースするだけでなく、次の変数に動的に切り替えるループ用に1つだけ作成したいと思っていました:)私は経験のコーダーではないでしょう、おそらくこのスクリプトへのより良いアプローチです:) – Impact

+0

@インパクト、私はあなたの痛みを感じますが、私は別のアプローチで行くでしょう。 Chromeのブックマークツールバーで、右クリックして[新しいウィンドウですべてのブックマークを開く]を選択できます。 Firefoxでは、同等のオプションは「すべてタブで開く」です。 – ghoti

+0

ありがとう@ ghoti。知っておいて、そのオプションに気付かなかった。しかし、私はこのスクリプトに、より多くの時間を要する機能を追加します。別のVPNトンネルを開き、バスティアンサーバーに接続するなどしたい私はこのスクリプトをgoodMorning.shと呼んでいたので、午前中にこのスクリプトが私のためにすべてをやり遂げることを願っています。私はコーヒーを飲んでいます。 – Impact

関連する問題