11.04.2013 Views

Guida avanzata di scripting Bash - Portale Posta DMI

Guida avanzata di scripting Bash - Portale Posta DMI

Guida avanzata di scripting Bash - Portale Posta DMI

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Esempio 26-14. Simulare uno stack push-down<br />

#!/bin/bash<br />

# stack.sh: simulazione <strong>di</strong> uno stack push-down<br />

Capitolo 26. Array<br />

# Simile ad uno stack <strong>di</strong> CPU, lo stack push-down registra i dati<br />

#+ sequenzialmente, ma li rilascia in or<strong>di</strong>ne inverso, last-in first-out<br />

#+ (l’ultimo inserito è il primo prelevato).<br />

BP=100 # Base Pointer (puntatore alla base) dello stack (array).<br />

# Inizio dall’elemento 100.<br />

SP=$BP # Stack Pointer (puntatore allo stack).<br />

# Viene inizializzato alla "base" (fondo) dello stack.<br />

Dato= # Contenuto <strong>di</strong> una locazione dello stack.<br />

# Deve essere una variabile locale,<br />

#+ a causa della limitazione del valore <strong>di</strong> ritorno <strong>di</strong><br />

#+ una funzione.<br />

declare -a stack<br />

push() # Pone un dato sullo stack.<br />

{<br />

if [ -z "$1" ] # Niente da immettere?<br />

then<br />

return<br />

fi<br />

let "SP -= 1" # Riposiziona lo stack pointer.<br />

stack[$SP]=$1<br />

return<br />

}<br />

pop() # Preleva un dato dallo stack.<br />

{<br />

Dato= # Svuota la variabile.<br />

if [ "$SP" -eq "$BP" ] # Lo stack è vuoto?<br />

then<br />

return<br />

fi # Questo evita anche che SP oltrepassi il 100,<br />

#+ cioè, impe<strong>di</strong>sce la "fuga" dallo stack.<br />

Dato=${stack[$SP]}<br />

let "SP += 1" # Riposiziona lo stack pointer.<br />

return<br />

}<br />

situazione() # Permette <strong>di</strong> verificare quello che sta avvenendo.<br />

{<br />

496

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!