Logo Informatizzati

Non è il verso di uno strano animale, nè l'incitazione di un fanatico, ma il nome di un interprete di comandi Linux che permette all'utente di comunicare col sistema operativo attraverso una serie di funzioni predefinite, o di eseguire programmi. Per una spiegazione più esauriente ti consiglio di guardare la voce Bash su Wikipedia .

L'ambito di interesse di questo articolo è Linux, ed in particolare la shell Bash.

L'intento di questo articolo è quello di raggruppare una serie di trucchetti/informazioni/chicchette che potrebbero venire utili nel lavoro di tutti i giorni...

P.S.: Il documento sarà in continua evoluzione, per adesso beccati queste poche cose poi ci sarà sempre di più...

Iniziamo!





Generatore di password

Questo script genera password casuali di 8 caratteri (ma più avanti vedrai che puoi generarle lunghe a piacere).

#!/bin/bash
# Su macchine un po’ vecchie,
#+ potrebbe essere necessario cambiare l’intestazione in #!/bin/bash2.
#
# Generatore di password casuali per Bash 2.x
#+ di Antek Sawicki <tenox@tenox.tc>,
# che ha generosamente permesso all’autore del documento il suo utilizzo.
#
# ==> Commenti aggiunti dall’autore del libro ==>
MATRICE="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
# ==> La password viene formata con caratteri alfanumerici.
LUNGHEZZA="8"
# ==> Se desiderate passaword più lunghe modificate ’LUNGHEZZA’.
while [ "${n:=1}" -le "$LUNGHEZZA" ]
# ==> Ricordo che := è l’operatore "sostiruzione default".
# ==> Quindi, se ’n’ non è stata inizializzata, viene impostata ad 1.
do
PASS="$PASS${MATRICE:$(($RANDOM%${#MATRICE})):1}"
# ==> Molto intelligente e scaltro.
# ==> Iniziando dall’annidamento più interno...
# ==> ${#MATRICE} restituisce la lunghezza dell’array MATRICE.
# ==> $RANDOM%${#MATRICE} restituisce un numero casuale compreso tra 1
# ==> e [lunghezza di MATRICE] - 1.
# ==> ${MATRICE:$(($RANDOM%${#MATRICE})):1}
# ==> restituisce l’espansione di lunghezza 1 di MATRICE
# ==> partendo da una posizione casuale.
# ==> Vedi la sostituzione di parametro {var:pos:lun},
# ==> con relativi esempi, al Capitolo 9.
# ==> PASS=... aggiunge semplicemente il risultato al precedente
# ==> valore di PASS (concatenamento).
# ==> Per visualizzare tutto questo più chiaramente,
# ==> decommentate la riga seguente
# echo "$PASS"
# ==> e vedrete come viene costruita PASS,
# ==> un carattere alla volta ad ogni iterazione del ciclo.
let n+=1
# ==> Incrementa ’n’ per il passaggio successivo.
done
echo "$PASS" # ==> Oppure, se preferite, redirigetela in un file.

exit 0

Rinominare dei file con nomi casuali
Riprendendo lo script della pagina precedente, possiamo sfruttarlo anche per rinominare dei file presenti in una cartella, dando loro un nome casuale.

A me questo è venuto utile per "mischiare" le foto da inserire in una di quelle cornici digitali che non ha la funzione di mostrare le foto in modo casuale.
Veniamo alla modifica dello script precedente.
Per pigrizia non sto a ripresentare tutti i commenti!

for x in $(ls)
do
while [ "${n:=1}" -le "$LUNGHEZZA" ]
do
PASS="$PASS${MATRICE:$(($RANDOM%${#MATRICE})):1}"
let n+=1
done

file="$(echo $x|awk -F"." '{print $1}')"
mv $file.jpg $PASS.jpg
PASS=""
let n=1
done


Salva questa roba in un file ed eseguilo nella cartella che contiene le foto.
Qualche spiegazione del funzionamento:
- il ciclo "for x" serve per "vedere" il contenuto della cartella;
- do per scontato che i file siano con estensione .jpg (minuscola). Se l'estensione è diversa devi modificare lo script di conseguenza.
- la variabile "file" è ottenuta togliendo dal nome del file l'estensione .jpg



Altra roba in bash
Vuoi sapere come si chiama lo script che stai usando?
Usa la variabile $0

Ciclo for

#!/bin/bash
#
# un for da C!
for i in $(seq 1 10); do
echo $i
done

#!/bin/bash
for((i=0; i<10; i++)); do
echo $i
done


Sostituire i ^M (Control-M o CTRL+M) nei file di testo creati con Winzozz
Se sei abituato ad utilizzare Vi fai così:
:%s/^M$//g
Ricorda che ^M lo ottieni premendo CTRL+V e poi CTRL+M e non digitando i due caratteri ^ e M.

Oppure da riga di comando:
sed ’s/^M//g’ old.file > new.file
Anche qui ricorda che
^M lo ottieni premendo CTRL+V e poi CTRL+M e non digitando i due caratteri ^ e M.


Dov'é il mio script bash? Come faccio a sapere dove si trova lo script che sto eseguendo?
Sembra una domanda banale, ma prova a farlo in bash con un solo comando!
Ecco qui uno script che ti permette di sapere dove si trova lo script che stai eseguendo; questo vuol dire che dovrai integrare questo codice nel tuo script.
#!/bin/bash -
IFS=$' \t\n'
declare -x PATH=/bin:/usr/bin

arg=$0; [[ -L $0 ]] && arg=$(stat -f '%Y' "$0")
pth=$(2>/dev/null cd "${arg%/*}" >&2; echo "`pwd -P`/${arg##*/}")
par=$(dirname "$pth")

echo "$par"

Tags

Commenti offerti da CComment