Leggere le righe di un file di testo ed eseguire un comando

A volte si devono leggere delle righe da un file di testo, ed eventualmente utilizzarle all'interno di un comando come argomenti o quant'altro...

Questo script legge tutte le righe di un file di testo saltando quelle vuote. Per ogni riga esegue un comando e genera un file log per la generazione di un eventuale file di report.

Ecco il listato:

 

#!/bin/bash

clear;
# Comando trap
trap bashtrap INT
# Funzione trap, eseguita alla pressione di CTRL+C
bashtrap()
{
  echo ""
  echo ""
  echo "ATTENZIONE!!! Rilevata sequenza comandi CTRL+C!"
  echo "Si è sicuri di voler interrompere lo script?"
  echo "1 - SI, interrompere script"
  echo "2 - NO, annulla interruzione e prosegui lo script"
  echo ""
  echo -n "Immettere la scelta (1 o 2): "
  scelta="0"
  while [[ $scelta != "1" && $scelta != "2" ]]; do
    read scelta
    if [[ $scelta != "1" && $scelta != "2" ]] ; then
      echo -n "Scelta non valida, ripeti: ";  
    fi
  done
  echo ""
  if [ $scelta == "1" ] ; then
    echo "INTERRUZIONE SCRIPT..."
    echo ""
    break;
  else                   
    echo "PREOSECUZIONE SCRIPT..."
    echo ""
  fi
}

echo "*******************************************************"
echo "INIZIO LETTURA DEL FILE "$1
echo "*******************************************************"
# verifica esistenza del file
if [ ! -f $1 ]; then
    echo "Il file $1 non esiste!"
else

# Link filedescriptor 10 con stdin
exec 10<&0
# stdin rimpiazzato con argomento 1 passato allo script
exec < $1
let count=0

# Memorizza nell'array ARRAY le righe del file e verifica, saltando, le righe vuote
while read LINE; do
  if [ ! -z $LINE ]; then
    ARRAY[$arraycount]=$LINE
    ((arraycount++));
  fi
  ((count++))
done

# Ripristino stdin dal filedescriptor 10 e chiusura filedescriptor 10
exec 0<&10 10<&-

totale=${#ARRAY[@]}
echo "Totale righe lette: "$totale
echo ""
echo "Lista righe lette:"
 for ((i=0; i<totale; i++)); do
   echo $i - ${ARRAY[i]}
 done
echo ""

# Eventuale comando che sfrutta le righe del file appena letto
echo "*******************************************************"
echo "ESECUZIONE COMANDO"
echo "*******************************************************"
temp1="0"
for ((i=0; i<totale; i++)); do
  temp1=$(echo "scale=2; 100/$totale" | bc )
  percentuale=$(echo "scale=2; $temp1*$(($i+1))" | bc )
# Ad esempio se il file è una lista di pacchetti da installare...
  sudo apt-get -y -u -V install ${ARRAY[i]}
# Ed eventuale scrittura di un array da usare come report...
  REPORT[$i]="$i - $? - ${ARRAY[i]}"
  echo "----------------------------------------------------------------------"
done

# Eventuale scrittura di un file di report utilizzando l'array precedentemente creato
# echo "==========================================================================">>report_log.txt
# date>>report_log.txt
# echo "==========================================================================">>report_log.txt
# for ((i=0; i<=totale; i++)) ; do
#   echo ${REPORT[i]}>>report_log.txt
# done
# echo "--------------------------------------------------------------------------">>report_log.txt
# echo "">>report_log.txt

fi

echo ""
echo "*******************************************************"
echo "FINE SCRIPT"
echo "*******************************************************"