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.
#!/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 "*******************************************************"