Inviare comando POST a script in PHP mediante BASH

Per un po’ di svago pomeridiano propongo oggi un veloce esercizio che unisca bash e PHP. Quello che vogliamo fare è creare uno script che da console ci chieda quali dati inviare mediante POST ad una pagina in PHP, che poi li utilizzerà per conto proprio.

Anzitutto costruiamo una pagina PHP opportunamente posizionata nel nostro webserver come la seguente:

In questo modo la pagina riceverà dei dati dal form e li scriverà nel file dati.txt, poi leggerà il file dati.txt e lo stamperà a schermo prima del form. Inutile dire che si tratta di una pagina a scopo di prova e sarebbe assolutamente inopportuno utilizzare un simile meccanismo online.

Adesso vediamo come creare il nostro script in bash:

Ricordo che per creare il file bash, nella posizione che desideriamo sarà sufficiente digitare qualcosa come:

Una volta creato ed inseriti tutti i dati ricordiamoci di dargli i permessi necessari perché possa essere seguito:

Faccio notare che il nostro file in PHP si chiama index.php e si trova su un percorso raggiungibile da http://localhost/test/index.php

Eseguendo il file in bash dovremmo vedere qualcosa di simile sulla nostra console:

Vedi articolo

Creare un programma con menu e opzioni di scelta in bash

Per gli esercizi dedicati a bash ne propongo uno rielaborato da me qualche mese fa per un corso.

Obiettivo: creare un semplice programma in bash che mostri un menu a schermo e ci permetta di fare delle scelte; in particolare mostrare un elenco di alunni e voti, aggiungere nomi di alunni e relativi voti, svuotare il “database” (in questo caso nient’altro che un file di testo) ed uscire dal programma

Nel nome delle funzioni non c’è niente di speciale, in particolare nelle funzioni showmenu e do_menu che ho chiamato così solo per abitudine, avendolo imparato a mia volta da script in inglese (potremmo dire anche scopiazzato!).

Commentiamo adesso i punti salienti del codice:

Riga 6: show_menu non fa niente di speciale, stampa semplicemente a video una serie di scritte usando echo (quando si usa echo senza una stringa a seguire si ottiene un semplice accapo); l’unico punto veramente interessante è alla riga 15 dove con echo -en ci prepariamo ad acquisire un valore in input. Questo valore in input in realtà viene acquisito dal read nella funzione successiva (riga 24).

Nel caso specifico echo -en vuol dire che passiamo alla funzione echo due parametri

-n evita di aggiungere newline alla fine della stringa, ovvero non manda accapo

-e interpreta eventuali backslash

Per capire meglio come funziona proviamo a scrivere nel terminale le seguenti righe

Questo comando darà in output il seguente risultato

Il cursore si troverà in attesa alla fine della stringa ed i caratteri \t saranno trasformati in tabulazione.

Se invece scriviamo:

Verrà stampato a video:

Senza alcuna tabulazione.

Riga 22: cominciamo un ciclo while finché la variabile $i non sarà uguale a “q”.

Riga 24: leggiamo l’input dopo aver lanciato, alla riga precedente show_menu; l’input verrà letto nella variabile $i; dopo aver acquisito $i trasformiamo eventuali maiuscole in minuscole, in modo che sia premendo Q che q si possa uscire dal programma (questo non è ovviamente necessario, ma lo facciamo a titolo di esercizio).

A questo punto usiamo case per verificare la scelta in $i; in caso di qualsiasi scelta fuorché quelle elencate (riga 40) verrà mostrato un messaggio, qui scherzosamente sdubbiato.

Alla riga 36 invece, quando $i è uguale a “q” eseguiamo l’uscita dal programma con un saluto.

A questo punto costruiamo i metodi elencati dentro case.

Riga 48: il metodo mostra fa semplicemente il grep del contenuto del file e poi lo passa ad un ciclo while che legge ogni riga in $i. Il contenuto del file $ELENCO sarà scritto nel modo seguente:

Mario:10
Luigi:9
Anna:7

Ovvero un elenco di nomi separati da : dai voti; uno per riga. Quindi leggendo il file in righe sostituiamo ad ogni : una tabulazione in modo da stamparli a video uno sotto l’altro e con una tabulazione tra nome e voto.

Riga 55: creiamo il metodo per aggiungere nomi e voti; anche qui l’operazione è molto semplice e giochiamo un po’ con gli echo, per ottenere un’interfaccia da terminale decente. Alla riga 65 assembliamo i valori raccolti nelle precedenti due variabili in una singola stringa di testo che scriviamo sul file $ELENCO.

Riga 82: qui svuotiamo l’elenco degli studenti salvati in $ELENCO, semplicemente cancellando il contenuto dell’intero file. Notiamo qui l’uso diverso di >> e >. Il primo appende alla fine del file il contenuto, mentre > sostituisce l’intero contenuto. In questo caso lo sostituisce con una stringa vuota.

Riga 85: qui usiamo il comando $? per prendere l’output dell’ultimo metodo utilizzato, nel caso specifico il metodo conferma (riga 69). Il metodo conferma scrive a video una stringa presa da $@; la variabile $@ prende la lista di tutti gli argomenti passati al metodo, un po’ come fanno $0, $1 ecc per i singoli argomenti; in questo caso significa semplicemente che li prendiamo tutti. Il metodo legge la risposta e la trasforma tutta in maiuscole, in modo tale che Y e y equivalgano entrambi ad una conferma. Se la risposta è tale la funzione restituisce 0, altrimenti 1. Utilizzando $? controlliamo questo valore restituito e se fa 0 allora cancelliamo tutti i dati, se fa 1 annulliamo la cancellazione.

Riga 93: lanciamo l’intero programma.

Riferimenti utili: base di programmazione in BASH

Vedi articolo

Operazioni elementari sui file con Bash

Anzitutto vediamo come creare una serie di file vuoti in bash, utilizzando il commando touch.

Adesso proviamo a rinominare i file creati (cambiando l’estensione da *.txt a *.log), tenendo a mente i seguenti modificatori fondamentali:

#: sottrae dall’inizio della stringa (minimale)

%: sottrae dalla fine della stringa (minimale)

: sostituisce una sottostringa con un altra (solo la prima volta che viene incontrata)

Infine mettiamo insieme il tutto in un piccolo eseguibile che, una volta richiamato, permette di modificare l’estensione di tutti i file da ext1 a ext2.

Il programma in questione accetta come argomento le due estensioni da modificare, qualora non vengano forniti esattamente due argomenti segnala all’utente l’utilizzo corretto. Dopodiché passa in rassegna, nella sua cartella di appartenenza tutto i file con estensione ext1 e li modifica all’estensione ext2.

Vedi articolo
Bash, ciclo for con sequenza

Bash, ciclo for con sequenza

Altro esempio di ciclo for con sequenza in bash.

Il risultato è così:

Vedi articolo