La Shell

La Shell è l'interprete dei comandi UNIX.

I comandi possono essere immessi al prompt oppure inseriti in un file eseguibile (tipo i file .BAT del DOS).

Il file eseguibile non deve avere nessuna particolare estensione, però deve essere, appunto, eseguibile.

Per rendere il file eseguibile
 
a livello utente, digitare:    chmod u+x nomefile
a livello gruppo, digitare:  chmod g+x nomefile
agli altri, digitare: chmod o+x nomefile
in un colpo solo:   chmod ugo+x nomefile

    
 

Piccola divagazione sul comando 'chmod':

se eseguiamo un comando 'ls -al' otterremo una lista del contenuto della dir in cui ci troviamo, una entrata  per riga, e all'inizio della riga una stringa del tipo
 

-rwxr-xr--

- il carattere nella prima posizione indica il tipo di entrata ('-' per i file, 'd' per le dir, ecc.)

- seguono tre insiemi di tre caratteri (nel nostro caso rwx,r-x, e r--):
    - il primo insieme da tre caratteri si riferisce all'utente
    - il secondo insieme da tre caratteri si riferisce al gruppo
    - il terzo insieme da tre caratteri si riferisce agli altri utenti

- in ciascun insieme:
    - il primo carattere, se 'w', abilita la scrittura su quella entrata
    - il secondo carattere, se 'r', abilita la lettura su quella entrata
    - il terzo carattere, se 'x', abilita l'esecuzione su quella entrata

Nel caso di un file con gli attributi -rwxr-xr--, sapremo che

- l'utente ha le abilitazioni a lettura(r), scrittura(w) ed esecuzione (x)
- gli altri utenti dello stesso gruppo hanno le abilitazioni a lettura(r) ed esecuzione (x)
- tutti gli altri hanno solo l'abilitazione alla lettura(r)

Dunque il comando 

chmod ugo+x nomefile

abilita(+) tutti (u,g,o) all'esecuzione (x) di nomefile

così come il comando 

chmod g-w nomefile

toglie(-) agli altri dello stesso gruppo (g) l'eventuale abilitazione alla sua modifica (w)

Si può agire contemporaneamente su tutti i parametri, facendo corrispondere un valore numero binario di tre bit a ciascun insieme:

il valore binario 111 (decimale 7) abilita tutto (rwx)
il valore binario 001 (decimale 1) abilita solo in esecuzione (--x)
il valore binario 010 (decimale 2) abilita solo in scrittura (-w-)
il valore binario 011 (decimale 3) abilita solo in scrittura ed esecuzione (-wx)
il valore binario 100 (decimale 4) abilita solo in lettura (r--)
il valore binario 101 (decimale 5) abilita solo in lettura ed esecuzione (r-x)
il valore binario 110 (decimale 6) abilita solo in lettura e scrittura(rw-)
il valore binario 111 (decimale 5) abilita  in lettura, in scrittura e in esecuzione (rwx)

Ad esempio, il comando:

chmod 754 nomefile

assegnerà a 'nomefile' la maschera vista all'inizio (rwxr-xr--)
 

Uno script normalmente inizia con una stringa che specifica il path del suo interprete, preceduto da #!, p.e.:

#!/bin/sh

se si tratta della Bourne Shell, oppure ksh per la Korn Shell, csh per la C Shell, ecc.

Elementi principali del linguaggio di Shell
 
prima riga #!path
commenti iniziano con #, su una sola riga
variabili non vanno dichiarate
non sono indicizzabili (array)
Assegnazione via:
nome_variabile=valore
read nome_variabile (input da utente)
Richiamabili col nome preceduto da $:
$nome_variabile
parametri Si tratta di variabili speciali:
$0 riporta il nome dello script
$# riporta il n. di parametri sulla linea di comando
$* riporta tutti i parametri sulla line a di comando
$? riporta l'esito dell'ultimo comando
$$ riporta il pid di eecuzione dello script
stringhe fra apici singoli: nessuna modifica
fra apici doppi: le variabili vengono sostituite
fra apici inversi (alt-96): vengono trattate come un comando e sostituite dal suo output
caratteri speciali !"$&'*?<>[]\`
per 'perdere' il loro significato speciale devono essere preceduti da \
expr expr int1 <op> int2
 <op> puo' essere: +, -, *, /, %
--------------------------------
n.b.: usare il 'quoting' per la moltiplicazione: expr $a \* 2
n.b.: parametri separati da blank
test - sulle stringhe:
test -z stringa - stringa vuota
test -n stringa - stringa non vuota
test stringa1 = stringa2 - stringhe uguali
test stringa1 != stringa2 - stringhe diverse
- sui numeri interi:
test int1 <op> int2
<op> puo' essere: -eq, -ne, -gt, -lt, -ge, -le
- sui file:
test <op> file
<op> puo' essere:
-e - empty
-s - not empty
-f - file
-d - directory
-o - owned by user
-r - read permission
-w - write permission
-x - exec permission
-c - char device (TTY)
-b - block device
- operatori logici:
-a - AND
-o - OR
! - NOT
--------------------------------
n.b.: parametri separati da blank
if if condizione
  then
      ...
  else
      ...
fi
case case espressione  in
   valore1) comando;;
   valore2) comando;;
   *) comando;;
esac
while while condizione
   do
      ...
   done
for for variabile in elenco
   do
      ...
   done

Esempi
 
prima riga #!/bin/sh
commenti #esempio di commento
variabili a=12
echo 'Digita gli anni'
read anni
mesi=`expr $a \* $anni`
echo "Numero mesi=$mesi"
parametri Si tratta di variabili speciali:
$0 riporta il nome dello script
$# riporta il n. di parametri sulla linea di comando
$* riporta tutti i parametri sulla line a di comando
$? riporta l'esito dell'ultimo comando
$$ riporta il pid di esecuzione dello script
stringhe v. esempio variabili
caratteri speciali !"$&'*?<>[]\`
per 'perdere' il loro significato speciale devono essere preceduti da \
expr per incrementare una variabile:
i=`expr $i + 1`
test v. esempio 'if'
if echo 'Digita gli anni'
read anni
if test $anni -lt 18
  then
      echo 'minorenne...'
  else
      echo 'maggiorenne...'
fi
case case $marca  in
   apple) echo 'ottima';;
   ibm) echo 'buona';;
   *) echo 'sconosciuta';;
esac
while # esempio 1 - conta fino a 10
while i -le 10
   do
      echo $i
      i=`expr $i + 1`
   done
# esempio 2 - elabora righe in input
# (anche con 'cat file.txt |' prima di while)
i=1
while read riga
   do
      echo "riga $i: $riga"
      i=`expr $i + 1`
   done
for for i in *.txt
   do
      cat $i >> testi
   done

 
 
Per approfondire:
Linux Zine
Linux Valley
Zio Budda
Linuxdoc unibo.it
Linuxdoc TELUG (Teramo)
Linuxdoc.org
Freeos.com
Linux.org
Link verificati il 30/01/2002

Torna a indice Guide