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 "*******************************************************"