informatica:sol:laboratorio15:esercitazionia:bashscriptexamples

Questa è una vecchia versione del documento!


Alcuni esempi di script bash

toupper.sh

Stampa a video i nomi passati come argomento allo script contenenti lettere minuscole in nomi con tutte le lettere maiuscole.

#!/bin/bash

# es.  >$ toupper pippo Pluto MINNI
#         pippo --> PIPPO
#         Pluto --> PLUTO

# per ogni argomento
for f in $@; do    
    # considero solo il nome e non eventuali path che lo precedono
    bname=`basename $f`
    # utilizzo tr per trasformare tutti i caratteri minuscoli in maiuscoli
    name=$(echo $bname| tr a-z A-Z)
    # se il nome conteneva lettere minuscole allora lo stampo sullo stdout
    if [ "$name" != "$bname" ]; then
	echo "$bname --> $name"
    fi
done

base2.sh

Dato un numero intero in base 10 come input stampa a video il numero in base 2.

#!/bin/bash

# es.  >$ base2.sh 11
#         11 --> 1011
#         

r=$(echo "obase=2; $1" | bc)
echo "$1 --> $r"

removeblanklines.sh

Data una lista di file testuali in input come argomenti dello script, rimuovere da ogni file le linee vuote.

#!/bin/bash

# se non ci sono argomenti stampo il messaggio di usage
if [ $#  -eq 0 ]; then
    echo "ERRORE: usa: `basename $0` lista-di-file"
    exit -1
fi
# per ogni argomento
for file in $@; do
    # controllo che sia un file regolare
    if [ ! -f $file ]; then
	echo "ERRORE, il file $file non esiste o non è un file regolare"
	exit 1
    fi
    # controllo che sia scrivibile
    if [ ! -w $file ]; then
	echo "ERRORE, il file $file non e' scrivibile"
	exit 2
    fi

    # rimuovo le linee bianche
    # ^ rappresenta l'inizio della linea
    # $ rappresenta la fine della linea
    $(sed -i '/^$/d' $file)

    if [ ! $? ]; then
	echo "ERRORE nella rimozione delle linee vuote nel file $file"
	exit 3
    fi
done

spaziodisco.sh (un esempio più complesso)

Data un nome di directory come argomento dello script, stampare sullo standard output la lista ordinata in modo decrescente (in base alla size) dei file/directory contenuti nella directory passata allo script, il tipo del file (F per file e D per directory) e la size in formato human readable.
Es: ./spaziodisco.sh /home

riccardo     D    15G
marta        D    9G
sara         D    6G
miofile      F    43K
#!/bin/bash

if [[ $# != 1 ]]; then
    echo "usa:"
    echo "  `basename $0` directory"
    exit 1
fi

if [ ! -d $1 ]; then
    echo "ERROR: $1 non è una directory"
    exit 2
fi
if [ ! -r $1 ]; then
    echo "ERROR: la directory $1 non è leggibile"
    exit 3
fi

# togliamo lo slash finale se c'e' (canonizzare)
# from http://tldp.org/LDP/abs/html/parameter-substitution.html
# ${var%Pattern} 
# Remove from $var the shortest part of $Pattern that matches the back end of $var. 
startdir=${1%/}

# creo una lista contenente l'output del comando du + sort
# sort -h ordina aspettandosi numeri in formato human readable 10K, 2G.....
data=( $(du -sh $startdir/* 2> /dev/null | sort -hr) )
# prendo il numero totale di elementi dalla lista 
ndata=${#data[@]} 

#scorro la lista prendendo le coppie <size, /startdir/dir> 
for((i=0;i<((ndata-1));i+=2)); do
    # suppongo che per default sia un file
    type=F
    # e' una directory ?
    if [ -d ${data[i+1]} ]; then
	type=D
    fi
    # prendo solo il nome
    name=`basename ${data[i+1]}`
    # faccio la stampa formattata usando printf (C-style)
    printf "%-30s\t%2s\t%-10s\n" $name $type ${data[i]}
done
informatica/sol/laboratorio15/esercitazionia/bashscriptexamples.1427662636.txt.gz · Ultima modifica: 29/03/2015 alle 20:57 (10 anni fa) da Massimo Torquati

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki