utilisation des array en ksh

Mise à jour: 27/07/2022
Version: 1.0
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2022 Jean-Louis BICQUELET-SALAÜN

utilisation des tableaux en ksh

Le ksh dispose de tableaux qui sont facilement utilisables. Nous allons voir comment faire.

##le script d’exemple

Le script sert à calculer l’espace occupés par les différents types de volume groupe (Oracle, systeme ..).

On va créer 3 tableaux qui vont contenir le nom du VG, son ID et la taille qu’il occupe.

La fonction oracle_type va déterminer le type du VG.

On parcourt les volumes physiques avec **lspv* et on remplit les différents tableaux

On notera que pour déclarer un tableau on utilise set -a

exemple:

set -A vg

On affiche ensuite la liste des disques, leurs tailles, leurs vgs et leurs id.

On parcourt les volumes groupes pour faire la somme de l’occupation disque.

Source du script:

#!/usr/bin/ksh
#=========================================================================
# script pour montrer l'utilisation des tableaux en ksh
#=========================================================================

set -A size
set -A vg
set -A id

cmdquery=lquerypv

header_ASM="ORCLDISK"
header_OCR="00000000   00820000 FFC00000 00000000 00000000"
header_VOTING="00000000   00220000 FFC00000 00000000 00000000"

#-------------------------------------------------------
# determine le type de disque
#-------------------------------------------------------
oracle_type
{
 if [ $2 = "none" ]
        then
                disk=$2
                header_l1=$( $cmdquery -h /dev/r$disk |head -1|cut -c 1-46)

                if [ $($cmdquery -h /dev/r$disk|grep -c $header_ASM) -ne 0 ]
                then
                        return "Disk ASM"
                elif [ "$header_l1" = "$header_OCR" ]
                then
                        return "Disk OCR Cluster" 
                elif [ "$header_l1" = "$header_VOTING" ]
                then
                        return "Disk VOTING Cluster"
                else
            return "status"
                fi       
        fi
}
        
#-------------------------------------------------------
# remplissage du tableau
# nb_elem contient  le nombre d'elements du tableau
#-------------------------------------------------------
j=0
for i  in $(lspv | awk '{print $1}')
do
  disk[j]=$i
  size[j]=$(bootinfo -s $i)
  vg[j]=$(lspv | grep "$i " | awk '{ print $3}')
  pvid=$(lspv | grep "$i " | awk '{ print $2}')
  id[j]=oracle_type $i $pvid
  let j=j+1
done
nb_elem=$j

#-------------------------------------------------------
# affiche la liste des disques, leurs tailles, leurs vgs  et leurs id
#-------------------------------------------------------
echo "disk      taille  vg      pvid"
#for j in $(awk -v nb=$nb_elem 'BEGIN { for (i=0;i<nb;i++) { print  i}  }')
for j in $(echo "for(i=0;i<$nb_elem;i=i+1) i" | bc)
do
  echo "${disk[$j]} ${size[$j]}  ${vg[$j]} ${id[$j]} "
done

#-------------------------------------------------------
# parcourt les volumes groupes pour faire la somme de l'occupation
#-------------------------------------------------------
sum_from=0
sum_to=0

# for j in $(awk -v nb=$nb_elem 'BEGIN { for (i=0;i<nb;i++) { print  i}  }')
# autre manière de faire

for j in $(echo "for(i=0;i<$nb_elem;i=i+1) i" | bc)
do
   if [ "${vg[$j]}" == "None" ] ; then
      let sum_to=sum_to+${size[$j]}
   else
      let sum_from=sum_from+${size[$j]}
   fi
done
echo
echo "somme disques depart:  $sum_from"
echo "somme disques arrivee: $sum_to"