別の配列からのbash配列変数の参照


8

これらの配列の変数名を保持する別の配列から複数の配列を参照するスクリプトを記述したいと思います。

これまでの私のコードは次のとおりです。

#!/bin/bash
array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')

array_names=('array1' 'array2')

for a in ${array_names[@]}
do
        for b in ${a[@]}
        do
                echo $b
        done
done

出力で両方の配列をスキャンして(外側のforループから)、echoを呼び出す内側のforループにそれぞれの文字列を出力します。私の現在の出力は私を示しています:

array1
array2

この点についてのご指摘をいただければ幸いです。ありがとうございました!


どうしてやれないのfor b in "${array1[@]}" "${array2[@]}"; do ...; done
クサラナンダ

配列の数を柔軟にしたいのですが。したがって、後で配列を追加する場合は、配列をarray_namesに追加して、ループに処理を任せるだけです。
chnppp

これは間接拡大の場合だと思います。stackoverflow.com/questions/8515411/…を参照してください。ただし、基本的には、変更${a[@]}加える${!a}ことで必要な操作を実行できます(私はそう思います)。
パルカマーク2017

1
@parkamarkいいえ、それは彼に各配列の最初の要素を与えるだけです。そして${!a[@]}、配列の長さを与えaます。
クサラナンダ

はい、変更すること${!a}は私に最初の要素を与えるだけです。
chnppp

回答:


7

Bash 4.3以降では、「名前参照」または名前参照をサポートしています(同様の概念がにも存在しますksh93、スコープがうっとうしく異なります)。

#!/bin/bash

array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')

array_names=('array1' 'array2')

for a in "${array_names[@]}"; do
    declare -n arr="$a"

    for b in "${arr[@]}"; do
        echo "$b"
    done
done

変数arrは、名前付き変数($aこの例では名前を持つ変数)のエイリアスのように機能するnamerefです。

名前参照がない場合、以前のBashバージョンでは、1つの解決策は、他の配列のすべての要素を含む新しい配列を作成することでした。

all=( "${array1[@]}" "${array2[@]}" )

... array_names質問の配列に少し似ていますが、すべての配列の内容が含まれているため、繰り返し処理され"${all[@]}"ます。

を使用することもできますevalが、結果のコードは驚くほどひどく見えます。

可変インダイレクションのバリエーションについては、glenn jackmanの回答を参照してください(現在の形式でBashバージョン2で導入)。



0

言われたことのバリエーションとして:

#!/bin/bash

array1=('array1 string1' 'array1 string2')
array2=('array2 string1' 'array2 string2')
array_names=('array1' 'array2')

for (( i=0; i<${#array_names[@]}; i++ )); do

    declare -n arr="${array_names[i]}"

    for (( j=0; j<${#arr[@]}; j++ )); do
        echo "${arr[j]}"
    done

done

代わりにインデックスで要素にアクセスする

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.