Benvenuto,
Ospite
|
ARGOMENTO:
Moderatori: Francesco.Alo, jpalombi
Benvenuto,
Ospite
|
|
Ciao a tutti,
come anticipato, apro questo thread per suggerirvi qualche esercizio per prendere un po' la mano con lo scripting della shell. Esercizio 1: dato il seguente script, che verifica la conformità di uno zip code al formato standard (XXXXX) o esteso (XXXXX-XXXX), con X cifra compresa tra 0 e 9, modificarlo in modo tale da usare un'unica espressione regolare all'interno della condizione IF. #!/bin/bash
read -p "Inserisci lo zip code: " zipcode
if echo $zipcode | grep -q -E '^[0-9]{5}$' 2>/dev/null || echo $zipcode | grep -q -E '^[0-9]{5}-[0-9]{4}$' 2>/dev/null
then
echo "Zip code corretto"
else
echo "Zip code non corretto"
fi Esercizio 2: sempre con riferimento allo script precedente, modificarlo separando l'esecuzione dei comandi usati nella condizione IF e utilizzando i valori di ritorno degli stessi come elementi all'interno della condizione. Esercizio 3: facendo uso della variabile di ambiente $RANDOM, scrivere uno script che chieda all'utente di indovinare un numero generato casualmente. Se l'utente non indovina, lo script deve chiedere nuovamente di indovinare dopo aver fornito un suggerimento (es: il numero inserito è minore o maggiore di quello da indovinare). Lo script termina quando l'utente ha indoviato il numero oppure quando ha esaurito i tentativi a sua disposizione (ad esempio 10). Esercizio 4: completare il seguente script per il backup di una installazione WordPress. Salvare il backup completo in una directory denominata wp-backup-YYYYMMGG, dove YYYYMMGG rappresenta la data corrente. Suggerimento: usare mysqldump per il backup del database. #!/bin/bash
if [ $# -eq 0 ]
then
wpdir='/var/www/html'
else
wpdir=$1
fi
if ! [ -d $wpdir -a -x $wpdir ]
then
echo "$wpdir: directory errata o permessi non sufficienti"
exit 1
elif ! [ -f $wpdir/wp-config.php ]
then
echo "Sembra che $wpdir non sia una installazione WP"
exit 1
fi
wpconfig=$wpdir/wp-config.php
echo "Userò il file $wpconfig come sorgente per l'accesso al DB"
dbname=$(grep DB_NAME $wpconfig | sed -E "s/define\( 'DB_NAME', '(.*)' \);/\1/")
dbuser=$(grep DB_USER $wpconfig | sed -E "s/define\( 'DB_USER', '(.*)' \);/\1/")
dbpasswd=$(grep DB_PASSWORD $wpconfig | sed -E "s/define\( 'DB_PASSWORD', '(.*)' \);/\1/")
echo "Utente db: $dbuser"
echo "Password db: $dbpasswd"
echo "Database: $dbname" |
Si prega Accedi a partecipare alla conversazione. |
|
Certamente! |
Si prega Accedi a partecipare alla conversazione. |
|
Per il primo esercizio, avevo fatto cosi:
#1° versione read -p "Inserisci lo zip code: " zipcode if echo $zipcode | grep -q -E '^[0-9]{4,5}$' 2>/dev/null then echo "Zip code corretto" else echo "Zip code non corretto" fi La variante che avevo pensato era usare questa espressione regolare: '^([0-9]{5}-(\1{4})?$' ma non sono del tutto sicuro che sia corretta. |
Si prega Accedi a partecipare alla conversazione. |
|
Non mi è chiaro perchè nello script originale, ci vuole il simbolo ^ all'inizio e alla fine dell'espressione $, lo zip code può essere di 4 cifre o di 5 cifre indiferrentemente dall'ordine delle cifre inserite. |
Si prega Accedi a partecipare alla conversazione. |
|
Per il secondo esercizio ho fatto cosi:
#2°versione #!/bin/bash read -p "Inserisci lo zip code: " zipcode var1=echo $zipcode | grep -q -E '^[0-9]{5}$' 2>/dev/null || echo $zipcode | grep -q -E '^[0-9]{5}-[0-9]{4}$' 2>/dev/null if [ $? -eq 0 ] then echo "Zip code corretto" elif [ $? -ne 0 ] then echo "Zip code non corretto" fi Sempre partendo dallo script originale, non mi è venuto in mente altro di migliore, ma sicuramente credo si possa migliorare cosi come gli altri script che ho fatto. |
Si prega Accedi a partecipare alla conversazione. |
|
Il 3° esercizio, ho scritto cosi:
#!/bin/bash read -p "Indovina il numero(max 10 tentativi):" numero for i in seq 1 10 read -p "Indovina il numero(tentativo $i): " numero if [ numero -eq $RANDOM ] then { echo "Hai indovinato il numero!" exit 0 } elif [ numero -gt $RANDOM ] then echo "Numero non indovinato,suggerimento:il numero da indovinare è minore del numero inserito" elif [ numero -lt $RANDOM ] then echo "Numero non indovinato,suggerimento:il numero da indovinare è maggiore del numero inserito" fi |
Si prega Accedi a partecipare alla conversazione.
Ultima Modifica: da pmenonna.
|
|
Per l'ultimo esercizio l'ho completato cosi:
#!/bin/bash currentdate=$(date +%Y%m%d) #creazione cartella di backup per installazione Wordpress mkdir wp-backup-$currentdate if [ $# -eq 0 ] then wpdir='/var/www/html' else wpdir=$1 fi if ! [ -d $wpdir -a -x $wpdir ] then echo "$wpdir: directory errata o permessi non sufficienti" exit 1 elif ! [ -f $wpdir/wp-config.php ] then echo "Sembra che $wpdir non sia una installazione WP" exit 1 fi wpconfig=$wpdir/wp-config.php echo "Userò il file $wpconfig come sorgente per l'accesso al DB" dbname=$(grep DB_NAME $wpconfig | sed -E "s/define\( 'DB_NAME', '(.*)' \);/\1/") dbuser=$(grep DB_USER $wpconfig | sed -E "s/define\( 'DB_USER', '(.*)' \);/\1/") dbpasswd=$(grep DB_PASSWORD $wpconfig | sed -E "s/define\( 'DB_PASSWORD', '(.*)' \);/\1/") echo "Utente db: $dbuser" echo "Password db: $dbpasswd" echo "Database: $dbname" #backup database mysqldump -u $dbuser -p $dbpasswd --opt --add-drop-database --lock-all-tables --databases $dbname > /wp-backup-$currentdate/backup_dump.sql #backup configurazione cp $wpdir/wp-config.php /wp-backup-$currentdate/wp-config.php.backup |
Si prega Accedi a partecipare alla conversazione. |
|
Questa versione non è corretta, in quanto la regex "^[0-9]{4,5}$" matcha una sequenza di 4 o 5 cifre, quindi accetta zip code nel formato:
Questa regex non è sintatticamente corretta (le parentesi tonde non sono bilanciate). Forse intendevi scrivere ^([0-9]{5})-(\1{4})?$
I delimitatori di stringa (inizio e fine) ci servono per accettare esattamente una riga che contiene solo ed esclusivamente lo zip code, senza altri caratteri a contorno. Se l'utente inserisce lo zip code semplice "12345" va bene, ma se inserisce "12345 saluti a tutti" non va bene. Faccio alcuni esempi di input che devono essere accettati dal programma:
I seguenti, invece, sono input da considerare errati:
|
Si prega Accedi a partecipare alla conversazione. |
|
Grazie, ora mi è chiaro, avevo allora capito male lo zipcode nei 2 formati il primo con 5 cifre e il secondo esteso con 5 cifre iniziali e 4 cifre finali opzionali. Lo script ammetto che l'ho fatto velocemente, non ci ho pensato su molto sinceramente (cosi come anche gli altri scripts che devo ricontrollare, sicuramente qualche errore l'ho fatto). Scusami la variante che intendevo io è questa: '^([0-9]) {5}-(\1 {4})?$ la avevo scritta su carta ma non l'avevo aggiornata su pc.... Questa dovrebbe essere corretta. |
Si prega Accedi a partecipare alla conversazione. |