mercoledì 10 luglio 2019

Mini-corso di bash per sfaticati frettolosi (prima parte)

  • Concetti base
I commenti iniziano col carattere "#".

La prima riga dello script tipicamente contiene solo #!/bin/bash per far capire al sistema di essere uno script bash; generalmente è buona norma usare l'estensione .sh anche se si marca come eseguibile con qualcosa tipo chmod 755 script.sh

Ogni comando restituisce un codice di errore da 0 a 255, con 0 che significa "OK". Uno script restituisce 0 quando termina, a meno di non voler concludere prima (esempio: exit 3).



  • Variabili
Le variabili sono esclusivamente stringhe. Si assegnano con "=" (senza spazi intermedi) e si usano con "$". È buona creanza usare tutte maiuscole per evitare di confonderle coi nomi dei comandi:
DINA=nitro
MITE=glicerina

echo faccio esplodere $DINA$MITE, non trovo la $MITE
Una variabile si può riempire con l'output di un programma, usando gli apici inversi (i caratteri "a capo" verranno sostituiti con degli spazi):
QUANTE_RIGHE=`wc -l < file.log`


  • Argomenti da command-line
Esempio: tre parametri obbligatori oppure "--help":
if [ $# != 3 -o "$1" == "--help" ]
then
  echo Errore 1: questo script bash richiede tre parametri
  exit 1
fi

echo terzo parametro: "$3"
Visto che la command-line è a disposizione di utenti tonti, conviene usare sempre ossessivamente le virgolette per evitare che spazi o apici facciano brutte sorprese:
TEMPFILE="/tmp/$2"

./comando > "$TEMPFILE"


  • Come si controlla l'uscita con errore
Versione brevissima: "comando || comandoalternativo" (il secondo viene eseguito soltanto se il primo esce con errore):
rm file.log || echo Errore, file non cancellato: proseguo lo stesso...

Versione breve: "if comando... then... fi"
if ./bin/prog3
then
  echo OK
else
  echo errore di sbaglio...
fi

Versione lunga: "comando... ERR=$? ...if then fi"
./bin/prog1
ERR=$?
if [ $ERR != 0 ]
then
  echo Errore $ERR, interrompo lo script
  exit $ERR
fi
echo OK, proseguo normalmente...
./bin/prog2


Condizioni tipiche

"Se file.log esiste, allora esegui questo":
if [ -f file.log ]
then
  ./bin/questo
fi
"Se non esiste, allora esegui quest'altro":
if [ ! -f file.log ]
then
  ./bin/quest_altro
fi
"Se esistono tale directory e tale file allora..." (occhio: quel "-a" significa AND)
if [ -d ../logdir -a -f altradir/file.log ]
then
  echo sposto il file...
  mv altradir/file.log ../logdir
fi
"Se il file esiste e non è vuoto (zero bytes)":
if [ ! -s file.log ]
then
  ./bin/controlla file.log
fi
"Se il file contiene almeno 20 righe" (occhio: il "-ge" significa Greater Than):
FILE=../file.log
RIGHE=`wc -l < $FILE`
ERR=$?
if [ $ERR != 0 ]
then
  echo Errore su $FILE
  exit 5
fi
if [ $RIGHE -ge 20 ]
then
  ./prog3 $FILE
fi
Altri dettagli qui.



Come si fanno i loop

Con "while condizione... do comandi... (break...) done" (per un loop continuo si usa "true"):
while true
do
  if ./bin/programma1
then
    sleep 30
  else
    ERR=$?
    break
  fi
done
Pure i cicli for, se hai una breve lista:
for EXT in jpg jpeg png mp4 mp3
do
  rm *.$EXT   # SBRANGGGG!!!
done

for FILE in ./films/*
do
  rm "$FILE"   # SBRANGGGGGG!!!
done

Nessun commento:

Posta un commento