Login

Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1

ARGOMENTO:

Esercizi Bash scripting 4 Anni 3 Mesi fa #1

  • gica78r
  • Avatar di gica78r Autore della discussione
  • Offline
  • Platinum Member
  • Platinum Member
  • Messaggi: 166
  • Ringraziamenti ricevuti 9
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.

Esercizi Bash scripting 4 Anni 3 Mesi fa #2

  • pmenonna
  • Avatar di pmenonna
  • Offline
  • Junior Member
  • Junior Member
  • Messaggi: 12
  • Ringraziamenti ricevuti 0
Possiamo inserire in questo thread le nostre soluzioni agli esercizi proposti?

Si prega Accedi a partecipare alla conversazione.

Esercizi Bash scripting 4 Anni 3 Mesi fa #3

  • gica78r
  • Avatar di gica78r Autore della discussione
  • Offline
  • Platinum Member
  • Platinum Member
  • Messaggi: 166
  • Ringraziamenti ricevuti 9

pmenonna ha scritto: Possiamo inserire in questo thread le nostre soluzioni agli esercizi proposti?


Certamente!

Si prega Accedi a partecipare alla conversazione.

Esercizi Bash scripting 4 Anni 3 Mesi fa #4

  • pmenonna
  • Avatar di pmenonna
  • Offline
  • Junior Member
  • Junior Member
  • Messaggi: 12
  • Ringraziamenti ricevuti 0
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.

Esercizi Bash scripting 4 Anni 3 Mesi fa #5

  • pmenonna
  • Avatar di pmenonna
  • Offline
  • Junior Member
  • Junior Member
  • Messaggi: 12
  • Ringraziamenti ricevuti 0

pmenonna ha scritto: 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.


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.

Esercizi Bash scripting 4 Anni 3 Mesi fa #6

  • pmenonna
  • Avatar di pmenonna
  • Offline
  • Junior Member
  • Junior Member
  • Messaggi: 12
  • Ringraziamenti ricevuti 0
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.

Esercizi Bash scripting 4 Anni 3 Mesi fa #7

  • pmenonna
  • Avatar di pmenonna
  • Offline
  • Junior Member
  • Junior Member
  • Messaggi: 12
  • Ringraziamenti ricevuti 0
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.

Esercizi Bash scripting 4 Anni 3 Mesi fa #8

  • pmenonna
  • Avatar di pmenonna
  • Offline
  • Junior Member
  • Junior Member
  • Messaggi: 12
  • Ringraziamenti ricevuti 0
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.

Esercizi Bash scripting 4 Anni 3 Mesi fa #9

  • gica78r
  • Avatar di gica78r Autore della discussione
  • Offline
  • Platinum Member
  • Platinum Member
  • Messaggi: 166
  • Ringraziamenti ricevuti 9

pmenonna ha scritto: 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



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:
  • 1234
  • 12345
Il primo non è uno zip code corretto; inoltre non accetta zip code nel formato esteso, ovvero 12345-6789.

pmenonna ha scritto: La variante che avevo pensato era usare questa espressione regolare:

'^([0-9]{5}-(\1{4})?$'


Questa regex non è sintatticamente corretta (le parentesi tonde non sono bilanciate). Forse intendevi scrivere
^([0-9]{5})-(\1{4})?$
ma l'uso della backreference in questo modo non ha molto senso.

pmenonna ha scritto: Non mi è chiaro perchè nello script originale, ci vuole il simbolo <strong>^</strong> all'inizio e alla fine dell'espressione <strong>$</strong>, lo zip code può essere di 4 cifre o di 5 cifre indiferrentemente dall'ordine delle cifre inserite.


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:
  • 12345
  • 00221
  • 12345-9987
  • 00000-0000

I seguenti, invece, sono input da considerare errati:
  • 12345-
  • 1234
  • 1234-12345
  • 12345-12345

Si prega Accedi a partecipare alla conversazione.

Esercizi Bash scripting 4 Anni 3 Mesi fa #10

  • pmenonna
  • Avatar di pmenonna
  • Offline
  • Junior Member
  • Junior Member
  • Messaggi: 12
  • Ringraziamenti ricevuti 0

gica78r ha scritto:

pmenonna ha scritto: Per il primo esercizio, avevo fatto cosi:
<em>#1° versione</em>

<code>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
</code>



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:
  • 1234
  • 12345
Il primo non è uno zip code corretto; inoltre non accetta zip code nel formato esteso, ovvero 12345-6789.

pmenonna ha scritto: La variante che avevo pensato era usare questa espressione regolare:
<code>'^([0-9]{5}-(\1{4})?$'</code>


Questa regex non è sintatticamente corretta (le parentesi tonde non sono bilanciate). Forse intendevi scrivere
<code>^([0-9]{5})-(\1{4})?$</code>
ma l'uso della backreference in questo modo non ha molto senso.

pmenonna ha scritto: Non mi è chiaro perchè nello script originale, ci vuole il simbolo <strong>^</strong> all'inizio e alla fine dell'espressione <strong>$</strong>, lo zip code può essere di 4 cifre o di 5 cifre indiferrentemente dall'ordine delle cifre inserite.


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:
  • 12345
  • 00221
  • 12345-9987
  • 00000-0000

I seguenti, invece, sono input da considerare errati:
  • 12345-
  • 1234
  • 1234-12345
  • 12345-12345


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.

  • Pagina:
  • 1
Moderatori: Francesco.Alojpalombi