- 2 Dicembre 2009
- 48
- 0
- Miglior risposta
- 0
1) Parametri posizionali ed altre variabili predefinite della shell
La shell utilizza un tipo particolare di variabili, dette parametri posizionali, per memorizzare ed identificare i parametri passati ad uno shell script sulla linea di comando. Il primo parametro della linea di comando è memorizzato in una variabile chiamata 1, il secondo parametro è memorizzato in una variabile chiamata 2 , e così via per tutti gli altri parametri posizionali. Questi nomi di variabile sono riservati esclusivamente all'ambiente di shell, percio' non possono essere utilizzati dagli utenti per nominare le proprie variabili. Come per tutte gli altri tipi di variabili per accedere al contenuto di tali variabili si deve far precedere il nome della variabile scelta dall'operatore $ .
esempio
$1
per ricavare il contenuto del parametro posizionale 1
esempio
Questo shell script, chiamato reverse, stampa sullo schermo i parametri ad esso passati in ordine inverso
# echo "$2" "$1"
# reverse Ciao mondo
# mondo Ciao
( il carattere # indica il prompt )
Variabili di shell
# memorizza il numero di argomenti della linea di comando, che sono stati passati
allo shell script
? memorizza il valore numerico di uscita dell'ultimo comando che è stato eseguito
0 memorizza il nome dello shell-script, che è stato introdotto
* memorizza tutti gli argomenti che sono stati introdotti sulla linea di comando
! contiene il numero dell'ultimo processo che è stato mandato in background con la &
- contiene i flag con cui è stata eseguita la shell
--------------------------------------------------------------------------------
2) Espressioni condizionali
Sono utilizzate principalmente nei comandi if e while.
La sintassi è :
espressione
Per costruire l'espressione, si usano diversi operatori predefiniti, quasi identici a quelli del linguaggio C,di quattro tipi :
Operatori su interi
int1 <= int2 Restituisce TRUE se int1 è minore o uguale a int2
int1 >= int2 " " se int1 è maggiore o uguale a int2
int1 < int2 " " se int1 è minore di int2
int1 > int2 " " se int1 è maggiore di int2
Operatori su stringhe
str1 == str2 Restituisce TRUE se str1 è uguale a str2
str1 != str2 " " se str1 è diverso da str2
Operatori su file
-r filename Restituisce TRUE se filename è leggibile
-w filename " " se filename è scrivibile
-x filename " " se filename è eseguibile
-e filename " " se filename esite
-o filename " " se filename è posseduto dall'utente corrente
-z filename " " se filename è di dimensione zero
-f filename " " se filename è un file normale
-d filename " " se filename è un file directory
Operatori logici
exp1 || exp2 Restituisce TRUE se exp1 è vero o se exp2 è vero
exp1 && exp2 " " TRUE se exp1 è vero e exp2 è vero
! exp " " TRUE se exp è non vero
--------------------------------------------------------------------------------
3) Costrutti condizionali
IF
Ha due forme differenti :
if (espressione1) then
comandi
else if (espressione2) then
comandi
else
comandi
endif
if (espressione) comando
se l'espressione è vera, esegue l'unico comando, altrimenti non fa nulla
esempio
# /bin/tcsh
if ( { -f .profile } ) then
echo " C'è un file .profile nella directory corrente. "
else
echo " Non esiste il file .profile . "
endif
Nota : l'uso delle parentesi graffe serve a prelevare il contenuto dell'espressione, ed è analogo all'operatore accento grave ` [ASCII 96 ].
--------------------------------------------------------------------------------
SWITCH
La sintassi è :
switch (stringa1)
case str1:
comandi
breaksw
case str2:
comandi
breaksw
.
.
.
default:
comandi
breaksw
endsw
Confronta stringa1 con tutte le stringhe successive, che seguono la parola chiave "case" : se una di queste coincide con stringa1 si eseguono i comandi sottoindicati, altrimenti vengono eseguiti i comandi posti sotto la parola chiave "default".
Le stringhe possono contenere anche metacaratteri.
esempio
Questo programma riconosce se la prima opzione della linea del comando che lo richiama è -i o -e. Il programma ha come primo argomento un'opzione e come secondo un file. Se l'opzione è -i, il programma conta il numero di linee del file che iniziano con la lettera i, se è -e stampa le caratteristiche del file su video, altrimenti stampa un breve messaggio di errore.
# /bin/tcsh
switch ( $1 )
case -i:
set count = ` grep ^i $2 | wc -l `
echo " Il numero di linee in $2 è $count "
breaksw
case -e :
ls -al $2
breaksw
default :
echo " Errore "
breaksw
endsw
--------------------------------------------------------------------------------
4) Costrutti iterativi
FOREACH
la sintassi è:
foreach name (list)
comandi
end
name è una variabile di ambiente, list è un elenco di stringhe separate da spazi; alla prima iterazione nella variabile name è memorizzata la prima stringa di list, e i comandi operano sul valore attuale di name. Nelle successive iterazioni, name conterra' di volta in volta tutte le altre stringhe della lista.
esempio
Questo programma converte da minuscolo a maiuscolo il contenuto dei file elencati nella linea di comando(elementi della lista), e il risultato è memorizzato in file con stesso nome ma con l' estensione .caps .
#/bin/tcsh
foreach file ($*)
tr a-z A-Z < $file > $file.caps
--------------------------------------------------------------------------------
WHILE
La sintassi è la seguente:
while (espressione)
comandi
end
Esegue i comandi elencati fintantochè l' espressione è vera.
esempio
Questo programma stampa sul video in succesione il nome dei parametri presenti sulla linea di comando, insieme al numero che ne indica la posizione sulla linea stessa.
#/bin/tcsh
set count = 1
while ( "$*" != " " )
echo " Il parametro $1 ha il numero di ordine $count "
shift
set count = ` expr $count + 1 `
end
--------------------------------------------------------------------------------
SHIFT
La sintassi è la seguente:
shift n
dove n indica di quante posizioni della linea di comando si deve scorrere verso sinistra
Tale comando sposta i valori, correntemente memorizzati come parametri posizionali della linea di comando, di una posizione a sinistra se non viene specificato alcun parametro al comando shift.
esempio
se i valori attuali dei parametri posizionali sono :
$1 = -r $2 = file1 $3 = file2
eseguendo il comando :
shift
si ottengono i seguenti parametri posizionali :
$1 = file1 $2 = file2
Questo comando è molto utile quando è necessario interpretare le opzioni della linea di comando
esempio
Il seguente programma legge un file di input e converte il suo contenuto in lettere minuscole, e memorizza il risultato su un file di output. Al programma si passano come opzioni della linea di comando due opzioni e due file, uno quello di input e l'altro quello di output.
Se l'argomento è -i allora il programma interpreta l'argomento successivo come il nome del file di input. Se l'argomento è -o allora il programma interpreta l'argomento successivo come il nome del file di output.
#/bin/tcsh
while( "$1" != " " )
if ( "$1" == "-i" ) then
set infile = "$2"
shift 2
else if( "1" == "-o" ) then
set outfile = "$2"
shift 2
else
echo " Il programma non ha riconosciuto l'opzione $1 "
endif
end
tr a-z A-Z < $infile > $outfile
--------------------------------------------------------------------------------
REPEAT
La sintassi è la seguente :
repeat contatore comando
E' un comando presente solo nella tcsh, permette di eseguire un comando specifico per un numero di volte specificato dal valore assegnato alla variabile contatore.
esempio
Questo è un programma a cui vengono passati come opzioni della linea di comando un insieme di numeri, che il programma stampera' sullo schermo mediante un numero di punti pari al valore numerico passato come argomento della linea di comando. Questo programma si comporta come un un programma grafico primitivo.
# foreach num ($*)
repeat $num echo -n "."
echo " "
end
--------------------------------------------------------------------------------
5) Comandi vari
BREAK
È usato per interrompere l'esecuzione di un ciclo foreach o while. Il flusso dello shell script prosegue alla linea successiva a quella del ciclo.
sintassi:
break
esempio
#!/bin/tcsh
foreach number (one two three exit four)
if ($number == exit) then
echo " È stato raggiunto exit "
break
endif
echo $number
end
--------------------------------------------------------------------------------
CONTINUE
È usato per interrompere l'esecuzione di un ciclo foreach o while. Trasferisce il controllo all'ultima istruzione del ciclo così’ da far continuare il ciclo all'iterazione successiva.
sintassi:
continue
esempio
#!/bin/tcsh
foreach number (one two three exit four)
if ($number == exit) then
echo " È stato raggiunto exit "
continue
endif
echo $number
end
--------------------------------------------------------------------------------
GOTO
È usato per modificare il flusso di uno script file; con il comando goto si sposta l'esecuzione del programma al comando identificato dalla label indicata dal comando goto.
sintassi
goto label
esempio
#!/bin/tcsh
if ($#argv != 1) goto error1
if ($argv[1] < 6) goto error 2
goto OK
error1:
echo "ERRORE- numero sbagliato di argomenti"
echo "USCITA"
exit 1
error2:
echo "ERRORE argomento - deve essere maggiore di 5"
echo "USCITA"
exit 1
OK:
echo "Argomento = $argv[1]"
exit 1
--------------------------------------------------------------------------------
Lettura dell'input dell'utente
A seconda del sistema adottato, per memorizzare in una variabile lo standard input si puo' usare sia “$<“ che l'output del comando “head -1” ( tale comando deve essere racchiuso tra backquotes `head -1` ).
sintassi
set variable = $<
- oppure -
set variable = `head -1`
esempio
#!/bin/tcsh
echo -n "Input della tua variabile : "
set input = $<
echo " Hai digitato : $input "
- oppure -
#!/bin/tcsh
echo -n "Input della tua variabile : "
set input = `head -1`
echo " Hai digitato : $input "
--------------------------------------------------------------------------------
Gestione dell'interruzione
Il comando “onitr” sposta l'esecuzione, all'interno dello shell script, all'istruzione indicata dalla label, quando viene premuto il tasto (CTRL-C). Questa possibilita' puo' essere sfruttata per cancellare file temporanei e uscire da un programma che dovrebbe essere interrotto.
sintassi
onintr label
esempio
#!/bin/tcsh
onintr close
while (1 == 1)
echo " Il programma è in esecuzione "
sleep 2
end
close:
echo " Fine del programma program "
Bye :hacker: Fonte: Hack Book
La shell utilizza un tipo particolare di variabili, dette parametri posizionali, per memorizzare ed identificare i parametri passati ad uno shell script sulla linea di comando. Il primo parametro della linea di comando è memorizzato in una variabile chiamata 1, il secondo parametro è memorizzato in una variabile chiamata 2 , e così via per tutti gli altri parametri posizionali. Questi nomi di variabile sono riservati esclusivamente all'ambiente di shell, percio' non possono essere utilizzati dagli utenti per nominare le proprie variabili. Come per tutte gli altri tipi di variabili per accedere al contenuto di tali variabili si deve far precedere il nome della variabile scelta dall'operatore $ .
esempio
$1
per ricavare il contenuto del parametro posizionale 1
esempio
Questo shell script, chiamato reverse, stampa sullo schermo i parametri ad esso passati in ordine inverso
# echo "$2" "$1"
# reverse Ciao mondo
# mondo Ciao
( il carattere # indica il prompt )
Variabili di shell
# memorizza il numero di argomenti della linea di comando, che sono stati passati
allo shell script
? memorizza il valore numerico di uscita dell'ultimo comando che è stato eseguito
0 memorizza il nome dello shell-script, che è stato introdotto
* memorizza tutti gli argomenti che sono stati introdotti sulla linea di comando
! contiene il numero dell'ultimo processo che è stato mandato in background con la &
- contiene i flag con cui è stata eseguita la shell
--------------------------------------------------------------------------------
2) Espressioni condizionali
Sono utilizzate principalmente nei comandi if e while.
La sintassi è :
espressione
Per costruire l'espressione, si usano diversi operatori predefiniti, quasi identici a quelli del linguaggio C,di quattro tipi :
Operatori su interi
int1 <= int2 Restituisce TRUE se int1 è minore o uguale a int2
int1 >= int2 " " se int1 è maggiore o uguale a int2
int1 < int2 " " se int1 è minore di int2
int1 > int2 " " se int1 è maggiore di int2
Operatori su stringhe
str1 == str2 Restituisce TRUE se str1 è uguale a str2
str1 != str2 " " se str1 è diverso da str2
Operatori su file
-r filename Restituisce TRUE se filename è leggibile
-w filename " " se filename è scrivibile
-x filename " " se filename è eseguibile
-e filename " " se filename esite
-o filename " " se filename è posseduto dall'utente corrente
-z filename " " se filename è di dimensione zero
-f filename " " se filename è un file normale
-d filename " " se filename è un file directory
Operatori logici
exp1 || exp2 Restituisce TRUE se exp1 è vero o se exp2 è vero
exp1 && exp2 " " TRUE se exp1 è vero e exp2 è vero
! exp " " TRUE se exp è non vero
--------------------------------------------------------------------------------
3) Costrutti condizionali
IF
Ha due forme differenti :
if (espressione1) then
comandi
else if (espressione2) then
comandi
else
comandi
endif
if (espressione) comando
se l'espressione è vera, esegue l'unico comando, altrimenti non fa nulla
esempio
# /bin/tcsh
if ( { -f .profile } ) then
echo " C'è un file .profile nella directory corrente. "
else
echo " Non esiste il file .profile . "
endif
Nota : l'uso delle parentesi graffe serve a prelevare il contenuto dell'espressione, ed è analogo all'operatore accento grave ` [ASCII 96 ].
--------------------------------------------------------------------------------
SWITCH
La sintassi è :
switch (stringa1)
case str1:
comandi
breaksw
case str2:
comandi
breaksw
.
.
.
default:
comandi
breaksw
endsw
Confronta stringa1 con tutte le stringhe successive, che seguono la parola chiave "case" : se una di queste coincide con stringa1 si eseguono i comandi sottoindicati, altrimenti vengono eseguiti i comandi posti sotto la parola chiave "default".
Le stringhe possono contenere anche metacaratteri.
esempio
Questo programma riconosce se la prima opzione della linea del comando che lo richiama è -i o -e. Il programma ha come primo argomento un'opzione e come secondo un file. Se l'opzione è -i, il programma conta il numero di linee del file che iniziano con la lettera i, se è -e stampa le caratteristiche del file su video, altrimenti stampa un breve messaggio di errore.
# /bin/tcsh
switch ( $1 )
case -i:
set count = ` grep ^i $2 | wc -l `
echo " Il numero di linee in $2 è $count "
breaksw
case -e :
ls -al $2
breaksw
default :
echo " Errore "
breaksw
endsw
--------------------------------------------------------------------------------
4) Costrutti iterativi
FOREACH
la sintassi è:
foreach name (list)
comandi
end
name è una variabile di ambiente, list è un elenco di stringhe separate da spazi; alla prima iterazione nella variabile name è memorizzata la prima stringa di list, e i comandi operano sul valore attuale di name. Nelle successive iterazioni, name conterra' di volta in volta tutte le altre stringhe della lista.
esempio
Questo programma converte da minuscolo a maiuscolo il contenuto dei file elencati nella linea di comando(elementi della lista), e il risultato è memorizzato in file con stesso nome ma con l' estensione .caps .
#/bin/tcsh
foreach file ($*)
tr a-z A-Z < $file > $file.caps
--------------------------------------------------------------------------------
WHILE
La sintassi è la seguente:
while (espressione)
comandi
end
Esegue i comandi elencati fintantochè l' espressione è vera.
esempio
Questo programma stampa sul video in succesione il nome dei parametri presenti sulla linea di comando, insieme al numero che ne indica la posizione sulla linea stessa.
#/bin/tcsh
set count = 1
while ( "$*" != " " )
echo " Il parametro $1 ha il numero di ordine $count "
shift
set count = ` expr $count + 1 `
end
--------------------------------------------------------------------------------
SHIFT
La sintassi è la seguente:
shift n
dove n indica di quante posizioni della linea di comando si deve scorrere verso sinistra
Tale comando sposta i valori, correntemente memorizzati come parametri posizionali della linea di comando, di una posizione a sinistra se non viene specificato alcun parametro al comando shift.
esempio
se i valori attuali dei parametri posizionali sono :
$1 = -r $2 = file1 $3 = file2
eseguendo il comando :
shift
si ottengono i seguenti parametri posizionali :
$1 = file1 $2 = file2
Questo comando è molto utile quando è necessario interpretare le opzioni della linea di comando
esempio
Il seguente programma legge un file di input e converte il suo contenuto in lettere minuscole, e memorizza il risultato su un file di output. Al programma si passano come opzioni della linea di comando due opzioni e due file, uno quello di input e l'altro quello di output.
Se l'argomento è -i allora il programma interpreta l'argomento successivo come il nome del file di input. Se l'argomento è -o allora il programma interpreta l'argomento successivo come il nome del file di output.
#/bin/tcsh
while( "$1" != " " )
if ( "$1" == "-i" ) then
set infile = "$2"
shift 2
else if( "1" == "-o" ) then
set outfile = "$2"
shift 2
else
echo " Il programma non ha riconosciuto l'opzione $1 "
endif
end
tr a-z A-Z < $infile > $outfile
--------------------------------------------------------------------------------
REPEAT
La sintassi è la seguente :
repeat contatore comando
E' un comando presente solo nella tcsh, permette di eseguire un comando specifico per un numero di volte specificato dal valore assegnato alla variabile contatore.
esempio
Questo è un programma a cui vengono passati come opzioni della linea di comando un insieme di numeri, che il programma stampera' sullo schermo mediante un numero di punti pari al valore numerico passato come argomento della linea di comando. Questo programma si comporta come un un programma grafico primitivo.
# foreach num ($*)
repeat $num echo -n "."
echo " "
end
--------------------------------------------------------------------------------
5) Comandi vari
BREAK
È usato per interrompere l'esecuzione di un ciclo foreach o while. Il flusso dello shell script prosegue alla linea successiva a quella del ciclo.
sintassi:
break
esempio
#!/bin/tcsh
foreach number (one two three exit four)
if ($number == exit) then
echo " È stato raggiunto exit "
break
endif
echo $number
end
--------------------------------------------------------------------------------
CONTINUE
È usato per interrompere l'esecuzione di un ciclo foreach o while. Trasferisce il controllo all'ultima istruzione del ciclo così’ da far continuare il ciclo all'iterazione successiva.
sintassi:
continue
esempio
#!/bin/tcsh
foreach number (one two three exit four)
if ($number == exit) then
echo " È stato raggiunto exit "
continue
endif
echo $number
end
--------------------------------------------------------------------------------
GOTO
È usato per modificare il flusso di uno script file; con il comando goto si sposta l'esecuzione del programma al comando identificato dalla label indicata dal comando goto.
sintassi
goto label
esempio
#!/bin/tcsh
if ($#argv != 1) goto error1
if ($argv[1] < 6) goto error 2
goto OK
error1:
echo "ERRORE- numero sbagliato di argomenti"
echo "USCITA"
exit 1
error2:
echo "ERRORE argomento - deve essere maggiore di 5"
echo "USCITA"
exit 1
OK:
echo "Argomento = $argv[1]"
exit 1
--------------------------------------------------------------------------------
Lettura dell'input dell'utente
A seconda del sistema adottato, per memorizzare in una variabile lo standard input si puo' usare sia “$<“ che l'output del comando “head -1” ( tale comando deve essere racchiuso tra backquotes `head -1` ).
sintassi
set variable = $<
- oppure -
set variable = `head -1`
esempio
#!/bin/tcsh
echo -n "Input della tua variabile : "
set input = $<
echo " Hai digitato : $input "
- oppure -
#!/bin/tcsh
echo -n "Input della tua variabile : "
set input = `head -1`
echo " Hai digitato : $input "
--------------------------------------------------------------------------------
Gestione dell'interruzione
Il comando “onitr” sposta l'esecuzione, all'interno dello shell script, all'istruzione indicata dalla label, quando viene premuto il tasto (CTRL-C). Questa possibilita' puo' essere sfruttata per cancellare file temporanei e uscire da un programma che dovrebbe essere interrotto.
sintassi
onintr label
esempio
#!/bin/tcsh
onintr close
while (1 == 1)
echo " Il programma è in esecuzione "
sleep 2
end
close:
echo " Fine del programma program "
Bye :hacker: Fonte: Hack Book
Ultima modifica: