Procedure e Variabili
Prima procedura
Scriverà ciao a standard output. Si chiamerà ciao.sh
.
Procedere come segue. Dare i comandi:
cd
- per assicurarsi di essere nella propria HOME directorymkdir shellex
- creazione della directory in cui eseguiremo gli esercizi shell, se già non esistecd shellex
- cambio directorypwd
- verifica di essere nella directory giusta, meglio sempre essere sicurivim ciao.sh
- editazione della procedura shell
Il comando di vim i
passa in modo editazione. Inserire il testo nel file:
echo "Ciao"
Ora uscire dalla modalità comando con Esc
e salvare ed uscire digitando :wq ENTER
.
Siamo usciti dal vim tornati alla CLI (comandi interattivi)
E' necessario che una procedura shell abbia il permesso di esecuzione. Glielo diamo col comando:
chmod +x ciao.sh
Ora la lanciamo col comando:
./ciao.sh
Se tutto è andato bene compare l'output:
Ciao
Se vi sono errori, occorre rieditare il file e correggerli.
In tal caso non è più necessario attribuire di nuovo il permesso di esecuzione.
Generalità
In una procedura shell vi è una istruzione per riga terminata da un ENTER
- Osservazione: il terminatore di riga di testo in Unix è
LF
(newline) e nonCR-LF
come in windows - Eventualmente più istruzioni per riga sono separate da
;
- Ma attenzione: mai mettere
;
dopo l'istruzionedo
- Ma attenzione: mai mettere
- I separatori di token sono SPAZIO e TAB
- Il TAB serve a indentare il codice e produrre programmi dall'aspetto visualmente più comprensibile
- Il primo token di ogni istruzione deve essere un comando
Lancio di una procedura shell
Dopo l'editazione della procedura proc
- Lancio esplicito:
bash proc [argomenti]
- Lancio implicito:
./proc [argomenti]
Non proc [argomenti]
- La directory corrente non è mai nel PATH per sicurezza
./proc
è un percorso completo: dice di lanciare proc dalla directory corrente (il punto)
- Prima del lancio implicito occorre dare alla procedura il permesso di esecuzione:
chmod +x proc
Basta farlo una sola volta
Note
- Commenti
- Dopo il carattere `#` e fino a fine riga
- Sempre una buona idea descrivere il file e il suo scopo all'inizio
- Indentazioni
- Codice incluso nei costrutti di scelta e di ciclo
- Solitamente un TAB per ogni indentazione
- Non necessarie per la shell
- Aiutano la comprensione umana della struttura del programma
- Hash-bang
- Buona norma mettere a prima riga
#! /bin/bash
Un file non compilato col permesso di esecuzione viene presunto essere un file interpretato e passato all'interprete di default, che è descritto dalla variabile d'ambiente SHELL
. Questo è di solito la bash in Linux (verificare col comando echo $SHELL
).
Per essere completamente formale e rendere più portatile la procedura è meglio sempre mettere a prima linea lo hash-bang:
i caratteri #!
seguiti dal percorso completo della shell.
Questo permette in generale di scrivere procedure anche per altri interpreti, oltre alla shell.
Per esempio, se anzichè essere una procedura shell fosse una procedura Perl, lo hash-bang sarebbe:
#! /usr/bin/perl
Variabili
- Non devono essere dichiarate
- Esistono appena vi si assegna un valore
conta=0
nome=Carlo
re='Numa Pompilio'
L'ultima è tra apici per nascondere lo spazio
-
Sono di tipo stringa (tranne eccezioni)
-
Assegnazione con l'0peratore
=
- Attenzione: non devono esserci spazi in un'assegnazione
L'assegnazione ha il formato:
nome=valore
C'è differenza tra nome e valore di una variabile:
- Nome:
conta
- Valore:
${conta}
(formale) o$conta
(se non vi sono confusioni)
Per vedere il valore della variabile di nome conts:
echo $conta
oppure
echo ${conta}
Esempio di variabili
(vars.sh):
a=55
echo "a vale $a"
echo "b vale >>$b<<"
a=$(($a+1))
a=`expr $a + 1`
echo "ora a vale $a"
h=$(hostname)
hh=`hostname`
echo "Nome macchina: $h"
echo "anche $hh"
meglio=con
echo ">>$megliosole<<"
echo "${meglio}sole"
Attribuirgli il permesso di esecuzione ed eseguire la procedura:
chmod +x vars.sh
./vars.sh
Il risultato è:
a vale 55
b vale >><<
ora a vale 57
Nome macchina: new-host
anche new-host
>><<
console
Nomi delle variabili
- Usano i caratteri minuscoli, maiuscoli e i numeri e lo underscore (
_
) - Non devono iniziare con un numero
- Non possono contenere spazi o altri caratteri
- C'è differenza tra maiuscole e minuscole
- Lunghezza massima: 32 caratteri
- Non possono essere parole riservate del linguaggio
Scopo delle variabili
- Tutte le variabili sono globali nell'intera procedura
- Non vi sono scopi più limitati
- Occorre evitare la duplicazione di nomi
- Non sono note ad altre sottoprocedure
Ambiente
- Insieme di variabili di sessione note a tutte le procedure
- Al lancio ogni procedura "eredita" le variabili d'ambiente
- E' possibile "esportare" una variabile all'ambiente
export VARIABILE=valore
- Sarà nota a tutte le procedure lanciate in seguito
- Per convenzione le variabili d'ambiente hanno nomi tutti in maiuscolo
Comandi esterni dall'interno delle procedure
E' possibile eseguire comandi di sistema dentro le procedure shell.
(info.sh):
#! /bin/bash
echo -e "\tUn po' di informazioni\n"
echo -n "Nome utente: "
whoami
echo -n "Nome macchina: "
hostname
echo -n "Data completa: "
date
Qui \t
è un TAB e \n
è un NEWLINE.
Dare il permesso di esecuzione e lanciare. Il risultato è simile a:
Un po' di informazioni
Nome utente: mich
Nome macchina: blueice
Data completa: sab 11 mar 2017, 10.42.56, CET
Il comando echo
Invia i suoi argomenti a standard output seguiti da un newline
Se gli argomenti contengono metacaratteri devono essere protetti da quotes
Opzioni:
-n
- non inviare il newline finale-e
- interpreta le sequenze di escape
Sequenze di escape principali:
\t
- tab\n
- newline extra\c
- non inviare il newline\b
- backspace\e
- escape
Aiuto sui comandi
- Aiuto generale:
help
- Produce una lista di tutti i comandi della shell
- Aiuto più specifico:
help comando
- Produce una corta sinossi del comando specificato
Manuale online della shell:
man bash
Descrizione di riferimento e non di apprendimento