Avanti Indietro Indice

7. Un po' di programmazione

7.1 Shell script: super file .BAT

Se usavate i file .BAT per creare diminutivi di lunghe linee di comando (io lo facevo spesso), questo si puo' ottenere inserendo degli alias in profile o .profile. Ma se i vostri .BAT erano piu' complessi, vi piacera' il linguaggio di scripting della shell: e' potente come il QBasic, se non di piu'. Ha variabili, strutture come while, for, case, if... then... else, e molte altre caratteristiche: puo' essere una buona alternativa ad un ``vero'' linguaggio di programmazione.

Per scrivere un file script---l'equivalente di un .BAT file sotto DOS---non si fa altro che scrivere un file ASCII contenente le istruzioni, lo si salva e poi lo si rende eseguibile col comando chgmod +x <scriptfile>. Per eseguirlo si scrive il suo nome.

Attenzione pero'. L'editor di sistema si chiama vi, e ho visto che molti nuovi utenti lo trovano molto difficile da usare. Non spieghero' come usarlo perché non mi piace e non lo uso; consultate ``Linux installation...'' di Matt Welsh, a pag. 109. (Fareste meglio a procurarvi un altro editor come joe o emacs per X.) Basti dire che:

Scrivere script sotto bash e' un argomento cosi' vasto che richiederebbe un libro per conto suo, e non daro' spiegazioni ma solo un esempio piuttosto completo di shell script, dal quale potrete intuire le regole di base:



#!/bin/sh
# esempio.sh
# Io sono un commento
# non cambiate la prima linea, deve restare cosi' com'e'
echo "Questa macchina e': `uname -a`" # usa l'output del comando
echo "Il mio nome e' $0" # variabile interna
echo "Mi hai dato i seguenti $# argomenti: " $*
echo "Il primo argomento e': " $1
echo -n "Come ti chiami? " ; read nome
echo guarda la differenza: "ciao $nome" # meccanismo di quoting con "
echo guarda la differenza: 'ciao $nome' # meccanismo di quoting con '
DIRS=0 ; FILES=0
for file in `ls .` ; do
  if [ -d ${file} ] ; then # se file e' una directory
    DIRS=`expr $DIRS + 1`  # DIRS = DIRS + 1
  elif [ -f ${file} ] ; then
    FILES=`expr $FILES + 1`
  fi
  case ${file} in
    *.gif|*jpg) echo "${file}: file grafico" ;;
    *.txt|*.tex) echo "${file}: file di testo" ;;
    *.c|*.f|*.for) echo "${file}: file sorgente" ;;
    *) echo "${file}: file generico" ;;
  esac
done
echo "ci sono ${DIRS} directories e ${FILES} files"
ls | grep "ZxY--!!!WKW"
if [ $? != 0 ] ; then # exit code dell'ultimo comando
  echo "non ho trovato ZxY--!!!WKW"
fi
echo "basta cosi'... scrivi 'man bash' se vuoi altre informazioni."

7.2 Programmare in C

Sotto Unix, il linguaggio di programmazione per eccellenza e' il C, vi piaccia o no. Ci sono anche molti altri linguaggi a disposizione (FORTRAN, Pascal, Lisp, Basic, Perl, awk...).

Dato per scontato che conosciate il C, ecco qui un paio di linee guida per quelli di voi che sono stati viziati dal Turbo C++ o analogo compilatore. Il compilatore C di Linux si chiama gcc e non ha tutte quelle cose che di solito accompagnano un compilatore per DOS: niente IDE, aiuto in linea, debugger integrato e cosi' via. È solo un compilatore a linea di comando, molto potente ed efficiente. Per compilare il classico hello.c si fa cosi':

$ gcc hello.c

che produce di default un eseguibile chiamato a.out. Per dargli un nome diverso:

$ gcc -o ciao hello.c

Per linkare una libreria al programma, si aggiunge lo switch -l<libname>. Per esempio, per linkare la libreria matematica:

$ gcc -o mathprog mathprog.c -lm

(Lo switch -l<libname> fa linkare a gcc la libreria /usr/lib/lib<libname>.a; quindi -lm linka /usr/lib/libm.a).

Finora, tutto bene. Ma se il vostro programma e' composto da molti file sorgenti, vi servira' l'utility make. Supponiamo che avete scritto un parser per espressioni: il sorgente si chiama parser.c e #include due file header, parser.h e xy.h. Volete usare le routine di parser.c in un programma, diciamo calc.c, che a sua volta #include parser.h. Che casino! Cosa bisogna fare per compilare calc.c?

Dovrete scrivere un cosiddetto makefile, che insegna al compilatore quali sono le dipendenze tra sorgenti e files oggetto. Nel nostro caso:



# Questo e' makefile, usato per compilare calc.c
# Premere il tasto <TAB> dove indicato

calc: calc.o parser.o
<TAB>gcc -o calc calc.o parser.o -lm
# calc dipende da due files oggetto: calc.o e parser.o

calc.o: calc.c parser.h
<TAB>gcc -c calc.c
# calc.o dipende da due files sorgenti

parser.o:  parser.c parser.h xy.h
<TAB>gcc -c parser.c
# parser.o dipende da tre files sorgenti

# end of makefile.

Salvate questo file come makefile e scrivete make per compilare il programma; in alternativa, salvatelo come calc.mak e scrivete make -f calc.mak. Ovviamente, LMP. Potete ottenere aiuto sulle funzioni del C, che sono illustrate da pagine man, sezione 3; per esempio,

$ man 3 printf

Ci sono tantissime librerie disponibili; tra le prime che vorrete usare ci sono ncurses, per gestire effetti in modo testo, e svgalib, per fare grafica. Se vi sentite abbastanza coraggiosi da affrontare la programmazione sotto X, procuratevi XForms ( bloch.phys.uwm.edu/pub/xforms) e/o una delle tante librerie che rendono facile la programmazione sotto X. Date un'occhiata a http://www.xnet.com/~blatura/linapp6.html .

Molti editor possono fungere da IDE; emacs e jed, ad esempio, hanno l'evidenziazione della sintassi, l'indent automatico e altre cose. Oppure, prendete il programma rhide da sunsite.unc.edu:/pub/Linux/devel/debuggers/. E' un clone della IDE Borland, e probabilmente vi piacera'.


Avanti Indietro Indice