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 directory
  • mkdir shellex - creazione della directory in cui eseguiremo gli esercizi shell, se già non esiste
  • cd shellex - cambio directory
  • pwd - verifica di essere nella directory giusta, meglio sempre essere sicuri
  • vim 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 non CR-LF come in windows
  • Eventualmente più istruzioni per riga sono separate da ;
    • Ma attenzione: mai mettere ; dopo l'istruzione do
  • 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