配列の継承ループ

配列の継承ループ

私は一連のbashホストを持っています。

a_hosts=( "host1.q.d.n",
  "host2.q.d.n",
  "host3.q.d.n",
  ...
  "hostN.q.d.n"
)

各ホストの特定のファイルを他のすべてのホストの同じファイルと比較する必要があります。

diff host1.file host2.file
diff host1.file host3.file
...
diff host1.file hostN.file

diff host2.file host3.file
...
diff host2.file hostN.file
...etc.

私の考えは以下に基づいています。このソリューションしかし、ループを試みるたびに常にコーナーに戻ります。loopN-1 変えるループを介してloopN配列をコピーし、両方の配列を同期したままにする必要があると思います。しかし、これは別のサイクルです。

この種の屋根ふき作業に対応できるエレガントなソリューションを思いついた人はいますか?


編集1:

私はこれを試しています。

# Create two loop arrays.
a_outer_loop=a_hosts
a_inner_loop=a_hosts

# Iterate through outer loop.
for s_fqdn1 in ${a_outer_loop[@]}
do
  # Pop the first item of the inner loop. (Index 0)
  a_inner_loop=( ${a_inner_loop[@]:1:} )

  # Loop through the popped inner loop.
  for s_fqdn2 in ${a_inner_loop[@]}
  do
    diff s_fqdn1.file s_fqdn2.file
  done
done

編集2:

確認する!申し訳ありません。例を過度に単純化する間違いを犯しました。私のホストのリストが実際にhost1、、host2...、なら、hostNこれははるかに簡単な問題です。残念ながら、複数のドメインにわたって処理する必要があるFQDNが複数あるため、単純なソリューションはhost$i機能しません。良いニュースは:効果があるものを見つけたと思います。

ベストアンサー1

要素のインデックスを使用して繰り返し、次にそのインデックスを使用して入れ子になったループから配列をオフセットします。

#! /bin/bash
a_hosts=( "host1.q.d.n"
  "host2.q.d.n"
  "host3.q.d.n"
  ...
  "hostN.q.d.n"
)

for i in "${!a_hosts[@]}"
do
    host1=${a_hosts[i]}
    for host2 in "${a_hosts[@]:i+1}"
    do
        echo "$host1" "$host2"
    done
done
  • ${!a_hosts[@]}- 配列のすべての要素のインデックス
  • ${a_hosts[@]:i+1}- オフセットから始まる配列i+1(配列添字の算術拡張)。

出力例(カンマを除く):

% bash foo.sh
host1.q.d.n host2.q.d.n
host1.q.d.n host3.q.d.n
host1.q.d.n ...
host1.q.d.n hostN.q.d.n
host2.q.d.n host3.q.d.n
host2.q.d.n ...
host2.q.d.n hostN.q.d.n
host3.q.d.n ...
host3.q.d.n hostN.q.d.n
... hostN.q.d.n

おすすめ記事