{"id":144,"date":"2019-10-31T21:17:45","date_gmt":"2019-10-31T20:17:45","guid":{"rendered":"http:\/\/www.forlex.it\/blog\/?p=144"},"modified":"2019-11-01T10:25:18","modified_gmt":"2019-11-01T09:25:18","slug":"mini-guida-per-bash-parte-3","status":"publish","type":"post","link":"http:\/\/www.forlex.it\/index.php\/2019\/10\/31\/mini-guida-per-bash-parte-3\/","title":{"rendered":"Mini guida per BASH &#8211; parte 3 &#8211;"},"content":{"rendered":"\n<p><strong>Memorizzare comandi utili<\/strong><br><br>A volte abbiamo bisogno di creare degli script che sono in realt\u00e0 una sequenza di utility da eseguire. In realt\u00e0 su diversi sistemi linux potremmo trovare la stessa utilit\u00e0 in posizioni diverse. In questo caso torna utile immagazzinare il percorso dell\u2019eseguibile all\u2019interno di una variabile che in caso di&nbsp; cambiamento&nbsp; sar\u00e0 facilmente aggiornabile,&nbsp; la variabile verr\u00e0 in seguito interpolata nella composizione di un comando.<br><br>#\/bin\/bash<br>LSCMD = \/bin\/ls<br>DIR = \/root<br>$LSCMD $DIR<br><br><strong>Quali variabili sono valorizzate nel mio sistema ?<\/strong><br><br>Usiamo il comando set ed il comando export \u2013p<br><br><strong>Quando realizziamo uno script, come facciamo ad ottenere i valori dei relativi parametri inseriti in input ?<\/strong><br><br>Nella realizzazione di script bash \u00e8 uso comune realizzare l\u2019input direttamente di parametri in fase di esecuzione, esempio : mioscript parametro1 parametro2. Per poter conoscere il valore di questi parametri faremo riferimento alle variabili ${1} e ${2} fino all\u2019n-esimo che sar\u00e0 appunto ${n}. N.B.: Per identificare ogni variabile usiamo le parentesi graffe, perch\u00e9 nel caso dovessimo richiamare il 10-imo elemento con il metodo $10 in realt\u00e0 avremmo il valore della variabile $1 seguita dal carattere zero (0).<br><br>#\/bin\/bash<br># nome script : provaparametri.sh<br>echo ${1}<br>echo ${2}<br><br>esecuzione : provaparametri&nbsp; hello world<br><br>Se avessimo l\u2019intenzione di riferirci a tutti i parametri inseriti in input useremo, invece, la variabile $<em>.<br><br>#\/bin\/bash<br># nome script : provaelenco.sh<br>for ELENCO in $<\/em><br>do<br>&nbsp;&nbsp; &nbsp;echo \u201cil file si chiama $ELENCO\u201d<br>done<br><br>esecuzione : provaelenco *.txt<br><br>A questo punto sorge un problema, se i parametri dati in input (ad esempio un elenco di 3 file) dovessero essere presenti dei parametri contenenti degli spazi (nome file.doc) lo script fallirebbe in quanto nella esecuzione del loop&nbsp; verrebbero identificati 4 parametri. La soluzione \u00e8 usare la variabile $@ racchiusa fra doppi apici , quindi \u201c$@\u201d sar\u00e0 il vero identificativo di ogni parametro. Il nostro script diventa dunque :<br><br>#\/bin\/bash<br># nome script : provaelenco2.sh<br>for ELENCO in \u201c$@\u201d<br>do<br>&nbsp;&nbsp; &nbsp;echo \u201cil file si chiama $ELENCO\u201d<br>done<br><br>esecuzione : provaelenco *.txt<\/p>\n\n\n\n<p><strong>Controllare i parametri in input ed il loro numero<\/strong><br> <br> Se volessimo sapere quanti parametri sono stati dati in input, perch\u00e9 magari c\u2019interessa che il nostro script ne riceva almeno uno,&nbsp; potremmo usare la variabile ${#} all\u2019interno di un costrutto if<br> <br> #\/bin\/bash <br> #nome script : quantiparametri.sh<br> if&nbsp; (( $# &lt; 1 ))<br> then <br> &nbsp;&nbsp; &nbsp;printf \u201c%b\u201d \u201cErrore pochi parametri\\n\u201d<br> &nbsp;&nbsp; &nbsp;printf \u201c%b\u201d \u201cInserire almeno un parametro\\n\u201d<br> &nbsp;&nbsp; &nbsp;exit 1<br> else<br> &nbsp;&nbsp; &nbsp;printf \u201c%b\u201d \u201cBravo numero giusto \u201c<br> fi<br> <br> In questo modo obbligheremo chi usa il nostro script ad inserire almeno un parametro (notate \\n&nbsp; vuol dire vai a capo). A questo punto stiamo pensando tutti ai comandi gi\u00e0 analizzati dove si dava come parametro un valore preceduto da una opzione come ad esempio ls \u2013F, dove -F \u00e8 una opzione e non \u00e8 un parametro, questo vuol dire che quando conrolleremo se \u00e8 stato inserito almeno un parametro la variabile $# dovr\u00e0 avere almeno valore 2. A questo punto per\u00f2 vogliamo anche essere sicuri che in presenza di pi\u00f9 parametri, il nostro script legga sempre e solo il loro valore. Introduciamo il comando shift, il quale sposta il cursore sulla stringa successiva; rielaboriamo il nostro script :<br> &nbsp;<br> #\/bin\/bash <br> #nome script : quantiparametri.sh<br> if&nbsp; (( $# &lt; 2 ))<br> then <br> &nbsp;&nbsp; &nbsp;printf \u201c%b\u201d \u201cErrore pochi parametri\\n\u201d<br> &nbsp;&nbsp; &nbsp;printf \u201c%b\u201d \u201cInserire almeno una opzione ed un parametro\\n\u201d<br> &nbsp;&nbsp; &nbsp;exit 1<br> elif&nbsp; [[ $1 = -p ]]<br> &nbsp;&nbsp; &nbsp;then <br> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;shift<br> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf \u201c%b\u201d \u201cHai selezionato l\u2019opzione \u2013p\\n \u201c<br> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf \u201c%b\u201d \u201cHai inserito il parametro : $1 \u201c<br> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;exit 0<br> else <br> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf \u201c%b\u201d \u201cDevi selezionare una opzione\\n \u201c<br> printf \u201c%b\u201d \u201cOpzioni disponibili : -p \u201c<br> exit 1<br> fi<br> <br> <strong>Controllare i parametri di default<\/strong><br> <br> La shell ci mette a disposizione altri tre operatori :- e := oltre a \ud83d\ude15 grazie ad essi potremo assicurarci che ogni variabile abbia il giusto valore<br> <br> &nbsp;&nbsp; &nbsp;:-&nbsp; assegna un valore ad una variabile se non inizializzata<br> &nbsp;&nbsp; &nbsp;:= assegna sempre un valore anche se la variabile \u00e8 gi\u00e0 inizializzata <br> &nbsp;&nbsp; &nbsp;\ud83d\ude15 rilascia un messaggio di errore se un parametro non \u00e8 impostato<br> <br><strong> Testare l\u2019esistenza di un file o di una directory, e non solo\u2026.<\/strong><br> <br> Nel caso dovessimo avere la necessit\u00e0 di conoscere gli attributi di file e directory, cos\u00ec da rendere il nostro script robusto nella sua esecuzione, potremo usare degli operatori unari che effettuano diversi tipi di controlli, notevole come ci siano diversi tipi di operatori che soddisfano le pi\u00f9 svariate esigenze, il loro uso \u00e8 &lt; operatore &gt;&nbsp; &lt; file &gt;. Ad esempio :<br> DIRECTORY = \/tmp<br> ILFILE = Desktop\/prova<br> ALTROFILE = Desktop\/prova.bk<br> if [ -d \u201c$DIRECTORY\u201d ]&nbsp;&nbsp; &nbsp;\/\/se $DIRECTORY \u00e8 una directory<br> then<br> &nbsp;&nbsp; &nbsp;if [ -e \u201c$ILFILE\u201d ]&nbsp;&nbsp; &nbsp;\/\/se esiste il file<br> &nbsp;&nbsp; &nbsp;\u2026\u2026.<br> else<br> fi<br> <br> di seguito vi elenco i controlli che potrete effettuare grazie agli operatori : <br> <br> -b &nbsp;&nbsp; &nbsp;il file \u00e9 un dispositivo a blocchi (come un hard disk, cdrom, floppy)<br> -c &nbsp;&nbsp; &nbsp;il file \u00e8 un dispostivo a cartteri (tastiera, modem, scheda audio, ecc.)<br> -d &nbsp;&nbsp; &nbsp;il file \u00e8 una directory<br> -e &nbsp;&nbsp; &nbsp;il file esiste<br> -f &nbsp;&nbsp; &nbsp; il file \u00e8 un file regolare (non una directory non un dispositivo a blocchi)<br> -g&nbsp;&nbsp; &nbsp; il file <br> -h &nbsp;&nbsp; &nbsp;il file un link simbolico<br> -N&nbsp;&nbsp; &nbsp;se il file \u00e8 stato modificato dalla sua ultima lettura<br> -O&nbsp;&nbsp; &nbsp;se si \u00e8 il proprietario di un file<br> -p &nbsp;&nbsp; &nbsp;il file \u00e8 una pipe<br> -r &nbsp;&nbsp; &nbsp; il file ha I permessi di lettura per l&#8217;utente che li prova <br> -s &nbsp;&nbsp; &nbsp;il file \u00e8 pi\u00f9 grande di 0 <br> -S &nbsp;&nbsp;&nbsp; il file \u00e8 un socket<br> -u &nbsp;&nbsp; &nbsp;testa se il bit Set UID del file \u00e8 stato impostato<br> -w&nbsp;&nbsp;&nbsp;&nbsp; il file \u00e8 scrivibile per l&#8217;utente che li prova <br> -x &nbsp;&nbsp; &nbsp;il file \u00e8 eseguibile per l&#8217;utente che li prova <br> <br> Inoltre nel confronto fra due file possiamo :<br> &nbsp;&nbsp; &nbsp;file1 \u2013nt file2&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/il file 1 \u00e8 pi\u00f9 nuovo di file2<br> &nbsp;&nbsp; &nbsp;file1 \u2013ot file2&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/il file 1 \u00e8 pi\u00f9 vecchio di file 2<br> &nbsp;&nbsp; &nbsp;file2 \u2013et file &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/il file 1 \u00e8 lo stesso che il file2<br> <br><strong> Operatori logici<\/strong><br> <br> -a = AND<br> -o = OR<br> <br> if [ -r $FILE -a -w $FILE ] \/\/se il file \u00e8 leggibile AND se \u00e8 scrivibile<br> <br><strong> Operatori di confronto<\/strong><br> <br> La shell ci offre diversi operatori di confronto per poter eseguire confronti fra numeri e altri per poter eseuire confronti fra stringhe, ecco un elenco : <br> <br> Confronto fra numeri &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Confronto fra stringhe&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Significato<br> &nbsp;&nbsp; &nbsp;-lt &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pi\u00f9 piccolo di <br> &nbsp;&nbsp; &nbsp;-le &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;= &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pi\u00f9 piccolo di o uguale a<br> &nbsp;&nbsp; &nbsp;-gt &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pi\u00f9 grande di <br> &nbsp;&nbsp; &nbsp;-ge &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;= &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pi\u00f9 grande di o uguale a <br> &nbsp;&nbsp; &nbsp;-eq &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =, == &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Uguale a <br> &nbsp;&nbsp; &nbsp;-ne &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; != &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diverso da <br> <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Memorizzare comandi utili A volte abbiamo bisogno di creare degli script che sono in realt\u00e0 una sequenza di utility da eseguire. In realt\u00e0 su diversi sistemi linux potremmo trovare la stessa utilit\u00e0 in posizioni diverse. In questo caso torna utile &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"http:\/\/www.forlex.it\/index.php\/2019\/10\/31\/mini-guida-per-bash-parte-3\/\"> <span class=\"screen-reader-text\">Mini guida per BASH &#8211; parte 3 &#8211;<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1,6],"tags":[],"_links":{"self":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts\/144"}],"collection":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/comments?post=144"}],"version-history":[{"count":2,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts\/144\/revisions"}],"predecessor-version":[{"id":157,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/posts\/144\/revisions\/157"}],"wp:attachment":[{"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/media?parent=144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/categories?post=144"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.forlex.it\/index.php\/wp-json\/wp\/v2\/tags?post=144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}