動的配列に値を追加する

動的配列に値を追加する
#!/bin/bash

range=$(seq -f "cen%04g" 1052 1099) 
range1=$(seq -f "rh%04g" 1052 1099)  

check () {
for node1 in ${range};do
   ping -q -c 1 -w 3 -s 10 $node1 >/dev/null
   if [ $? -eq 0 ];then
       $i_up+=(${node1}",")
   else
       $i_down+=(${node1}",")
   fi
done
}

for i in "site1" "site2" "site3"
do
   declare -a $i_down
   declare -a $i_up
   check &
done
  1. サイト(site1、site2、site3)を並列に実行し、各サイトの配列入力を個別に取得できるように、forループ入力に基づいて配列名を指定する方法がわかりません。それ以外の場合は、各実行に時間がかかります。
  2. 私は一連のcen(1052から1099)を持っていますが、そこにそれが見つからない場合は、同じ番号を持つ別のシリーズ(rh)を確認する必要があります。例:cen1052が存在しない場合は、rh1052を確認する必要があります。どうすればいいですか?

答え1

私はあなたが探していると思いますparset

checkhost() {
    piing() {
        ping -q -c 1 -w 3 -s 10 "$1" >/dev/null
    }
    if piing "cen$1"; then
      echo "+cen$1"
    else
      if piing "rh$1"; then
         echo "+rh$1"
      else
        if piing "deb$1"; then
           echo "+deb$1"
        else
           echo "-cen$1"
        fi
      fi
    fi
}
export -f checkhost
parset updown -j0 checkhost ::: {1052..1099}
echo "${updown[@]}"

これらのサイトが機能するためにどのように必要かは不明です。たとえば、追加するドメイン名の場合は、次のことができます。

parset updown -j0 checkhost {1}.{2} ::: {1052..1099} ::: site1.com site2.com site3.com

parsetGNU Parallelの一部です。 GNU Parallelをインストールしたら、parset次のように有効にする必要があります。

  • (永久に)env_parallel --installその後、新しいシェルを起動します。
  • (この会議のみ). $(which env_parallel.bash)

これが望ましくない場合は、完全な例を作成して継続的に実行することをお勧めします。

関連情報