Oggi costruiamo una semplice ma potente calcolatrice.
Partiamo dal risultato finale:
calcolatrice(){ awk "BEGIN{ print $* }" ;}
Da questa semplice (si fa per dire) riga di codice ne possiamo trarre gli ingredienti per poterla costruire.
Anzitutto c'è una funzione, la cui sintassi è la seguente:
calcolatrice() { comandi; }
Il comando della funzione (ne può contenere vari, eh), è costituito in questo caso da awk. Ad awk chiediamo di stampare il contenuto della variabile $*
$* è un parametro speciale. Possiamo dire che è una variabile il cui contenuto è costituito da ciò che noi diamo in pasto allo script a mo' di parametri posizionali.
Un esempio di parametri posizionali per la nostra calcolatrice può essere 5 + 6, che print di awk, essendo perspicace, riconosce come operazione aritmetica, e la svolge.
Ricordo che la funzione altro non è che del codice inerte, che diventa "vivo" solo quando viene richiamata, la funzione, col suo nome.
Se digitiamo il codice di cui sopra nel terminale, non succede un bel nulla. E il fatto che non succeda nulla vuol dire che il codice è scritto secondo la sintassi giusta.
Facciamo una prova, digitiamo il codice della nostra calcolatrice nel terminale:
calcolatrice(){ awk "BEGIN{ print $* }" ;}
Ora per richiamarla basta digitarne il nome seguito dall'operazione aritmetica che vogliamo svolgere. Esempio
calcolatrice 5+6
oppure
calcolatrice 5/6
Da quest'ultima operazione potrete notare come la nostra calcolatrice supporta benissimo i numeri decimali. Ben sei numeri dopo la virgola!!
La calcolatrice è pronta, tuttavia...
Tuttavia se chiudete il terminale, lo riaprite e richiamate la funzione con la vostra operazione da svolgere, vi viene restituito:
calcolatrice: comando non trovato
Essì, reset!!! Per evitare di scrivere ogni volta il codice della nostra calcolatrice dobbiamo riportarlo anche nel .bashrc, che si trova nella home dell'utente.
Abbiamo due modi per farlo. Andare a cercare il file .bashrc e incollare il codice di cui sopra, alla fine del testo, oppure costruire una riga di comando che faccia il lavoro sporco al posto nostro. Da lanciare una sola volta, eh! Infatti ">>" andrà ad "appendere" il codice della nostra calcolatrice nel file .bashrc.
echo "calcolatrice(){ awk \"BEGIN{ print \$* }\" ;}" >> ~/.bashrc
Di questa riga colpiscono i tre "\" (backslash). Uno serve a conservare il parametro speciale, che altrimenti sparirebbe. Gli altri due servono a mantenere i doppi apici al codice di awk. Provate a toglierli tutti e tre e vedete cosa succede.
Un'ultima cosa. Anche dopo aver aggiunto la riga di codice all'interno del file .bashrc, se provate a richiamare la calcolatrice, essa ancora non funziona. In realtà fin quando il terminale non verrà chiuso, non si accorgerà della modifica, a meno che...
A meno che non digitiamo:
source ~/.bashrc
Ecco, provate. E alla prossima.
Altri articoli della rubrica "Brevi Esercizi" li trovate qui.
sabato 12 luglio 2014
lunedì 7 luglio 2014
Una cosa sugli arrays [bash]
Si erano fatte le tre di notte e stavo seguendo un video in tedesco, fattomi pervenire per posta da un mio caro amico da Köln. Un corso di bash in tedesco, per intenderci. Tutto bene fino a quando il tale, che tra l'altro con il suo suono gutturale della voce mi ha stimolato i succhi gastrici, si è espresso in questi termini, più o meno:
definiamo un array:
$ valori=(1 2 3 4 5 6 7 8 9)
Ora, secondo lui, cioè il tale di cui sopra, se faccio
$ echo ${valori[*]}
$ echo ${valori[@]}
dovrei ottenere lo stesso risultato. Ed è proprio così. Ottengo tutti i valori dell'array. Ma non è questo il punto. Dai, questa cosa la sapevamo...
Mi sono detto, possibile che questi due caratteri, "@" e "*", non abbiano alcuna differenza in codesto ambito?
In realtà sì, una differenza l'ho scovata, forse. Magari ce ne sono pure altre.
$ for i in "${valori[*]}"; do echo " $i "; done #con i doppi apici
0 1 2 3 4 5 6
$ for i in ${valori[*]}; do echo " $i "; done #Senza doppi apici
0
1
2
3
4
5
6
Mentre nel caso del carattere @,
$ for i in ${valori[@]}; do echo " $i "; done #senza doppi apici
$ for i in "${valori[@]}"; do echo " $i "; done #con i doppi apici
ottengo sempre, come risultato,
0
1
2
3
4
5
6
Sicuramente i miei cari amici Ennio e Juhan ne sapranno di più.
Chi volesse approfondire gli arrays in bash, segnalo l'indice del progetto bash, qui.
definiamo un array:
$ valori=(1 2 3 4 5 6 7 8 9)
Ora, secondo lui, cioè il tale di cui sopra, se faccio
$ echo ${valori[*]}
$ echo ${valori[@]}
dovrei ottenere lo stesso risultato. Ed è proprio così. Ottengo tutti i valori dell'array. Ma non è questo il punto. Dai, questa cosa la sapevamo...
Mi sono detto, possibile che questi due caratteri, "@" e "*", non abbiano alcuna differenza in codesto ambito?
In realtà sì, una differenza l'ho scovata, forse. Magari ce ne sono pure altre.
$ for i in "${valori[*]}"; do echo " $i "; done #con i doppi apici
0 1 2 3 4 5 6
$ for i in ${valori[*]}; do echo " $i "; done #Senza doppi apici
0
1
2
3
4
5
6
Mentre nel caso del carattere @,
$ for i in ${valori[@]}; do echo " $i "; done #senza doppi apici
$ for i in "${valori[@]}"; do echo " $i "; done #con i doppi apici
ottengo sempre, come risultato,
0
1
2
3
4
5
6
Sicuramente i miei cari amici Ennio e Juhan ne sapranno di più.
Chi volesse approfondire gli arrays in bash, segnalo l'indice del progetto bash, qui.
sabato 5 luglio 2014
Pari o dispari [bash]
Salve!
Oggi un esercizio facile facile.
Come faccio a far riconoscere a bash se un numero è pari o dispari?
Assegno alla variabile n il numero in questione:
$ n=141
poi divido la variabile n per due e ne assegno il risultato alla variabile n1
$ n1=$[$n/2]
Il risultato che viene assegnato alla variabile n1 lo moltiplico per 2 e ne assegno a sua volta il risultato alla variabile n2
$ n2=$[$n1*2]
E ora passiamo alla verifica.
$ test $n -ne $n2 && echo dispari || echo pari
Ora facciamo un piccolo script che ci chiede un numero e ci restituisce come risposta se è pari o dispari.
#!/bin/bash
read -p "dammi un numero: " n
n1=$[$n/2]
n2=$[$n1*2]
test $n -ne $n2 && echo "$n è dispari" || echo "$n è pari"
exit 0
Semplice, no? :)
Alla prossima.
P.S. L'indice della rubrica "Brevi Esercizi" qui.
Oggi un esercizio facile facile.
Come faccio a far riconoscere a bash se un numero è pari o dispari?
Assegno alla variabile n il numero in questione:
$ n=141
poi divido la variabile n per due e ne assegno il risultato alla variabile n1
$ n1=$[$n/2]
Il risultato che viene assegnato alla variabile n1 lo moltiplico per 2 e ne assegno a sua volta il risultato alla variabile n2
$ n2=$[$n1*2]
E ora passiamo alla verifica.
$ test $n -ne $n2 && echo dispari || echo pari
Ora facciamo un piccolo script che ci chiede un numero e ci restituisce come risposta se è pari o dispari.
#!/bin/bash
read -p "dammi un numero: " n
n1=$[$n/2]
n2=$[$n1*2]
test $n -ne $n2 && echo "$n è dispari" || echo "$n è pari"
exit 0
Semplice, no? :)
Alla prossima.
P.S. L'indice della rubrica "Brevi Esercizi" qui.
martedì 24 giugno 2014
Script con password
Salve!
È da mesi ormai che lavoro ad un programma. Presto ve ne parlerò. Promesso.
Stanotte, come diversivo, ho voluto abbozzare l'idea di come si potrebbe inserire la password all'interno di uno script. Mi spiego meglio.
Supponete di creare uno script che accede ad un database per manipolarlo, l'ideale sarebbe che lo stesso script vi chieda anche una password prima di potervi accedere.
Lo script che vi sto per presentare vi chiede, per una sola volta, di creare una password, che viene salvata in un file di testo. Certo, poi questo file andrebbe criptato, lo capisco bene.
Poi vi chiede di ridigitare la password, che viene confrontata con quella salvata nel file di testo. Solo se le due password corrispondono, l'accesso all'ipotetico database sarà consentito. La seconda volta che sarà avviato lo script, a meno che non sia stato cancellato il file con la password, vi sarà chiesto di digitare la password una sola volta.
Salvate lo script, pass.sh, nella cartella Documenti e rendetelo eseguibile.
Alla prossima! ;)
È da mesi ormai che lavoro ad un programma. Presto ve ne parlerò. Promesso.
Stanotte, come diversivo, ho voluto abbozzare l'idea di come si potrebbe inserire la password all'interno di uno script. Mi spiego meglio.
Supponete di creare uno script che accede ad un database per manipolarlo, l'ideale sarebbe che lo stesso script vi chieda anche una password prima di potervi accedere.
Lo script che vi sto per presentare vi chiede, per una sola volta, di creare una password, che viene salvata in un file di testo. Certo, poi questo file andrebbe criptato, lo capisco bene.
Poi vi chiede di ridigitare la password, che viene confrontata con quella salvata nel file di testo. Solo se le due password corrispondono, l'accesso all'ipotetico database sarà consentito. La seconda volta che sarà avviato lo script, a meno che non sia stato cancellato il file con la password, vi sarà chiesto di digitare la password una sola volta.
Salvate lo script, pass.sh, nella cartella Documenti e rendetelo eseguibile.
#!/bin/bash
#Luigi Iannoccaro (Bit3Lux)
#Pass.sh
passkr=~/Documenti/pass.txt
if [ ! -f $passkr ]; then
#read -p "crea la tua password: " tua_password
tua_password=$(zenity --title="Crea la password" --password)
echo $tua_password > $passkr
fi
tua_pass=$(cat $passkr)
pass=0
while [ "$tua_pass" != "$pass" ]; do
clear
#read -p "Digita la tua password: " pass
pass=$(zenity --title="Digita la password" --password)
if [ $? -eq 1 ]; then
exit 1
elif [ "$tua_pass" != "$pass" ]; then
#echo "Accesso al programma negato, digita la password in modo corretto."
zenity --info \
--width=300 \
--height=130 \
--title="Informazione" \
--text="Accesso Negato! Digita la password in modo corretto."
elif [ "$tua_pass" == "$pass" ]; then
#echo "Accesso consentito."
zenity --info \
--width=300 \
--height=130 \
--title="Informazione" \
--text="Accesso Consentito"
fi
done
exit 0
Alla prossima! ;)
Etichette:
Lubit,
SCripting,
Ubuntu script
Iscriviti a:
Post (Atom)