Backup solo se… esercizio in bash – 2

contatti

Aggiornamento: ELENCO[0] è errato, corretto in ELENCO[@]

Continuo da qui, con un’avvertenza: questi post sono per “nuovi”, i quirk dei commenti precedenti sono benvenuti, saranno magari oggetto di un post successivo ma continuo in modo piano, banale. In fondo sono niubbo anch’io, anzi über- 😀

Quando si deve ripetere più volte un gruppo di istruzioni si usano i cicli. Ecco un esempio:

#!/bin/bash

ELENCO=("alfa" "beta" "gamma" "d e l t a")

for (( i=0; i < ${#ELENCO[@]}; i++)); do
    ST=${ELENCO[${i}]}
    echo $i - $ST
done

c0

L’elenco può essere scritto meglio, una voce per riga così:

#!/bin/bash

ELENCO=("alfa"
        "beta"
        "gamma"
        "d e l t a"
       )

for (( i=0; i < ${#ELENCO[@]}; i++)); do
    ST=${ELENCO[${i}]}
    echo $i - $ST
done

Un’altra cosa utile –non indispensabile in casi semplici come questo ma utile– è l’uso delle funzioni. In bash (Bourne Again Shell e il suo predecessore sh, Bourne Shell) ovviamente ci sono, mica come in quel SO con le finestre volanti e adesso sghembe, ecco come.

#!/bin/bash

function terpri() {
    echo $1 $2
}

ELENCO=("alfa"
        "beta"
        "gamma"
        "d e l t a"
       )

for (( i=0; i < ${#ELENCO[@]}; i++)); do
    ST=${ELENCO[${i}]}
    terpri $i "$ST"
done

f0.sh

Nelle righe 3-5 viene definita la funzione terpri –terminal print, chissà dove ho già sentito questo nome?– che visualizzerà i due argomenti che gli saranno passati.
Il ciclo viene modificato chiamando la funzione terpri (riga 15). Notare che le voci dell’elenco (variabile ST) possono contenere spazi per cui si rende necessario l’uso delle virgolette.

Vediamo adesso come trattare i nomi dei file. Questo può riferirsi a un file nella directory corrente, quindi senza indicazione del percorso (path) o in una qualunque posizione all’interno del file system, quindi completo di percorso (path). Vediamo qualche caso:

#!/bin/bash

echo Caso normale
N=$(pwd)"/"$0
echo completo:" " $N
FN=$(basename "$N")
echo nome file: $FN
DIR=$(dirname "$N")
echo directory: $DIR

echo -e "\nSolo nome file"
N=$0
echo completo:" " $N
FN=$(basename "$N")
echo nome file: $FN
DIR=$(dirname "$N")
echo directory: $DIR

echo -e "\nNomi con spazi"
N=~"/alpha/b e t a/gam ma"
echo completo:" " $N
FN=$(basename "$N")
echo nome file: $FN
DIR=$(dirname "$N")
echo directory: $DIR

echo -e "\nEstensione"
N=$0
echo nome file:" " $0
EXT=${N##*.}
echo estensione: $EXT

n0

Ricordo che pwd (print working directory), riga 4, restituisce la directory corrente, come dice il nome e che i comandi racchiusi tra $() vengono eseguiti con priorità maggiore, nel nostro caso prima di concatenare i 3 elementi da inserire in N.

Se vogliamo sapere l’estensione del nome del file possiamo operare come alla riga 30, l’espressione è traducibile in tutto quello che segue l’ultimo punto, caso simile a quello di %% visto nel post precedente.

L’uso di ~ alla riga 20 non viene espanso, vediamo come possiamo operare.

#!/bin/bash

echo -e "\nEspansione di ~"
echo -e usando la variabile HOME: $HOME
ABS=~
echo -e usando l\'espandione di "~": $ABS
N=$ABS"/alpha/b e t a/gam ma"
echo e quindi, p.es.: $N

e0

Con questo abbiamo tutti gli elementi che ci servono per comporre il nostro script. Cosa che affronteremo la prossima puntata. Anche perché –temo– ci saranno sorprese. Mica finisce semplicemente come avevamo pensato :mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • lightuono  Il 4 luglio 2014 alle 10:05

    Secondo me è più pulita la forma

    for chiave in [espressione] ; do

    qualcosa

    done

    • juhan  Il 4 luglio 2014 alle 15:17

      Hai ragione; ma qui siamo nuovi e poi alla fine c’è la sorpresa.
      Sono solo 1) indaffarato; 2) insalutato (cioè problemi salute per di caldo). Ma continuo appena posso.
      E alla fine, probabilmente, una raccolta delle osservazioni. Se la squadra mi assiste (e non scappa) 😉

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: