Mini guida per BASH – parte 2 –

Estrarre l’occorrenza di una stringa all’interno di un testo.

Supponiamo che c’interessi sapere se esiste la stringa “due” e poi la stringa “sei” all’interno del file utilizzato nell’esempio con tail.

 #> grep -i ‘due’ test.txt  // restituirà l’occorrenza della stringa
 #> grep -i ‘sei’ test.txt   // restituisce nulla perchè la stringa ‘sei’ non è presente

Leggere l’input di un utente 

Usando il comando read potremo salvare quanto inserito all’interno di una variabile.

#> read -p “Inserisci input : ” VAR  // visualizzeremo la striga fra apici doppi come prompt, quello che noi digiteremo verrà memorizzato all’interno della variabile $VAR
 read -s -p “Password : ” PASS; printf “%b” “\n” // visualizza la richiesta di password, quando digitiamo non vedremo i relativi caratteri. Il comando printf è stato aggiunto per mandare a capo dopo l’inserimento.

Sapere se un comando è stato eseguito con successo

La bash ci fornisce la variabile $? questa contiene due probabili valori, zero (successo) e non zero. Qundi nel caso di :

 #> ls …/; echo $?// avremo come risultato 2 (ovviamente il comando è sbagliato) 
 #> ls ../; echo $? // avremo come risultato 0, successo.

Controllare l’esecuzione di un comando per poterne eseguire altri

Quando sorge la necessità di controllare il flusso di esecuzione di comandi nasce l’esigenza di studiare un costrutto noto del mondo della programmazione : if the else .

 #> ls; if (( $? == 0)); then echo “fatto”; else echo “errore”; fi // se il comando ls viene eseguito con successo scrivi “fatto” altrimenti “errore”.   

Eseguire più comandi contemporaneamente.

Fin’ora abbiamo imparato ad eseguire più comandi in sequenza, grazie al punto e virgola (;). Questo però non ci permette d’iniziare l’esecuzione di un comando finchè non termina il precedente. Risolviamo con il simbolo di e commerciale (&) che può essere usata singola nel caso il comando successivo non deve attendere il termine del precedente. Nel caso usassimo la doppia & (&&) vuol dire che il comado successivo attenderà il termine del precedente. N.B. Quando utilizziamo la & singola, la shell ci comunica l’identificativo del processo (PID) che è stato assegnato al comando prima della & preceduto dal job 1 per il primo comando ecc..

#> ls & sleep 2 // in questo caso avremo in output il PID e subito dopo l’output di ls 
#> ls && sleep 2// in questo caso avremo prima l’output di ls ed altermine verrà eseguito lo sleep di 2 secondi