<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>de.straba.us &#187; bash</title>
	<atom:link href="http://de.straba.us/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://de.straba.us</link>
	<description>destrabauz thoughts</description>
	<lastBuildDate>Fri, 20 Jan 2012 13:55:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>pillole di comandi gnu/linux</title>
		<link>http://de.straba.us/2011/01/04/pillole-di-comandi-gnulinux/</link>
		<comments>http://de.straba.us/2011/01/04/pillole-di-comandi-gnulinux/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 13:30:28 +0000</pubDate>
		<dc:creator>napo</dc:creator>
				<category><![CDATA[software libero]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[cli]]></category>

		<guid isPermaLink="false">http://de.straba.us/?p=549</guid>
		<description><![CDATA[eliminare tutti i file con estensione diversa da quella prescelta rm !(*.ext1&#124;*.ext2&#124;*.ext3&#124;&#8230;&#124;*.extN) Esempio: cancellare tutto nella directory ad esclusione dei file .php rm !(*.php) visualizzazione delle directory a struttura ad albero ls -R &#124; grep &#8220;:$&#8221; &#124; sed -e &#8216;s/:$//&#8217; -e &#8216;s/[^-][^\/]*\//&#8211;/g&#8217; -e &#8216;s/^/ /&#8217; -e &#8216;s/-/&#124;/&#8217; calcolatrice da command line ? () { echo [...]]]></description>
			<content:encoded><![CDATA[<h2>eliminare tutti i file con estensione diversa da quella prescelta</h2>
<blockquote><p>rm !(*.ext1|*.ext2|*.ext3|&#8230;|*.extN)</p></blockquote>
<p>Esempio:<br />
cancellare tutto nella directory ad esclusione dei file .php<br />
<code>rm !(*.php)</code></p>
<h2>visualizzazione delle directory a struttura ad albero</h2>
<blockquote><p>ls -R | grep &#8220;:$&#8221; | sed -e &#8216;s/:$//&#8217; -e &#8216;s/[^-][^\/]*\//&#8211;/g&#8217; -e &#8216;s/^/   /&#8217; -e &#8216;s/-/|/&#8217;</p></blockquote>
<h2>calcolatrice da command line</h></p>
<blockquote><p>? () { echo &#8220;$*&#8221; | bc -l; }</p></blockquote>
<p>definisce una funzione per fare semplici conti, una volta invocato il comando (meglio copiarlo nel .bashrc) ci si accede secondo questa sintassi: <em>? formula matematica</em><br />
Esempio: <code>? 14+12*60+3*3600</code></p>
<h2>eliminare i doppioni in un file di testo</h2>
<blockquote><p>awk &#8216;!x[$0]++&#8217; file.txt</p></blockquote>
<p>elimina duplicati da un file di testo (es. file.txt) attraverso awk, l&#8217;output va rediretto in un nuovo file, per un ordinamento passare il valore in pipe a sort.<br />
Esempio:<br />
<code>awk '!x[$0]++' file.txt | sort > newfile.txt</code></p>
<h2>ottenere uno screenshot dello schermo</h2>
<blockquote><p>import filename.png</p></blockquote>
<p>Si tratta di un comando ImageMagik<br />
Una volta dato il comando occorre individuare l&#8217;area da catturare attraverso un rettangolo da disegnare con il mouse</p>
<h2>fare un video del proprio desktop e convertirlo in mpeg</h></p>
<blockquote><p>ffmpeg -f x11grab -r 25 -s 1024&#215;768 -i :0.0 /tmp/outputFile.mpg</p></blockquote>
<p>Genera un file mpeg, a 25 frame al secondo delle dimensioni di 1024&#215;768 con il contenuto di quanto appare sullo schermo. Per uscire dalla registrazione premere CTRL-C</p>
<h2>genera password casuali da 8 caratteri</h2>
<blockquote><p>strings /dev/urandom | grep -o &#8216;[[:alnum:]]&#8217; | head -n 8 | tr -d &#8216;\n&#8217;; echo</p></blockquote>
<p>Il numero di carattere è modificabile, nel caso sopra riportato è 8, ma può essere esteso</p>
<h2>eliminare il testo di una stringa</h2>
<blockquote><p>${string/&#8221;substring&#8221;}</p></blockquote>
<p>Esempio:<br />
<code><br />
stringa="cinematografo"<br />
echo ${stringa/"tografo"}<br />
</code><br />
&#8230; stampa il valore &#8220;<em>cinema</em>&#8221; invece che &#8220;<em>cinematografo</em>&#8221;</p>
<p>source:</p>
<ul>
<li><a href="http://blog.urfix.com/25-%25E2%2580%2593-sick-linux-commands/">http://blog.urfix.com/25-%25E2%2580%2593-sick-linux-commands/</a></li>
<li><a href="http://www.tuxarena.com/?p=388">http://www.tuxarena.com/?p=388</a></li>
<li><a href="http://tldp.org/LDP/abs/html/string-manipulation.html">http://tldp.org/LDP/abs/html/string-manipulation.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://de.straba.us/2011/01/04/pillole-di-comandi-gnulinux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Miniguida alla creazione di booklet da un pdf su A4</title>
		<link>http://de.straba.us/2009/06/09/miniguida-alla-creazione-di-booklet-da-un-pdf-su-a4/</link>
		<comments>http://de.straba.us/2009/06/09/miniguida-alla-creazione-di-booklet-da-un-pdf-su-a4/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 16:12:05 +0000</pubDate>
		<dc:creator>napo</dc:creator>
				<category><![CDATA[software libero]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[booklet]]></category>

		<guid isPermaLink="false">http://de.straba.us/?p=70</guid>
		<description><![CDATA[Intro Un booklet e&#8217; un libretto/fascicolo/opuscolo delle dimensioni di un foglio A5 (~metá A4). Li si ottiene piegando uno o più fogli A4 piegati al centro, sul lato più lungo. In questa piccola guida si presenta come trasformare un documento scritto su uno o più fogli A4 (l&#8217;importante e&#8217; che il numero di pagine sia [...]]]></description>
			<content:encoded><![CDATA[</p>
<p><br/><br/><br/><br/><br />
<strong>Intro</strong><br />
Un booklet e&#8217; un libretto/fascicolo/opuscolo delle dimensioni di un foglio A5 (~metá A4).<br />
Li si ottiene piegando uno o più fogli A4 piegati al centro, sul lato più lungo.<br />
In questa piccola guida si presenta come trasformare un documento scritto su uno o più fogli A4 (l&#8217;importante e&#8217; che il numero di pagine sia un multiplo di 4) in un booklet.<br />
La serie di tool presentati faranno il primo lavoro, il secondo dipende molto dalla stampante e da come gestisce la stampa fronte/retro</p>
<p><img class="alignnone size-full wp-image-71" title="booklet" src="http://de.straba.us/wp-content/uploads/2009/06/booklet1.png" alt="booklet" width="452" height="527" /></p>
<p><strong>Per i più pigri</strong><br />
I produttori del software &#8220;BookletGenerator&#8221; offrono un servizio online gratuito a questo indirizzo <a href="http://bookletcreator.com/">http://bookletcreator.com/</a><br />
Il servizio funziona egregiamente: upload del file e restituzione della versione booklet.<br />
Unico dubbio: ma il mio documento pdf che fine fa una volta sul server?</p>
<p><strong>Scripting con le psutils</strong><br />
Le <a href="http://www.tardis.ed.ac.uk/~ajcd/psutils/">psutils</a> sono una vecchissima raccolta di strumenti per la manipolazione del postscript a command line in grado di risolvere il nostro problema.<br />
Fra i tool spicca il buon psbook, che già di suo e in grado di preparare le pagine per il nostro booklet, occorre pero fare uso di altri tool per fare in modo che le pagine abbiamo la giusta sequenza.<br />
Ecco qui una sequenza &#8220;magica&#8221; per risolvere il nostro problema</p>
<p><code>psbook in_file.ps | psnup -2 | psresize | pstops '2:0,U1(21cm,29.7cm)' &gt; booklet.ps</code></p>
<p><em>in_file.ps</em> é il file postscript in ingresso, mentre<em> booklet.ps</em> e&#8217; il risultato.<br />
<em>psbook</em> crea il booklet, <em>psnup</em> mette due pagine per foglio, <em>psresize</em> ridimensiona le pagine su A4 e <em>pstops</em> si occupa di dare ordine sulla pagina.<br />
<code>ps2pdf booklet.ps  booklet.pdf</code> poi per ottenere la versione pdf del booklet pronto per la stampa</p>
<p>Il vero problema, forse,é quello di avere un file in formato postscript.<br />
A questo ci pensa l&#8217;utility <em>pdf2ps</em> (<span style="text-decoration: underline;">caldamente sconsigliato</span> l&#8217;uso di <span style="text-decoration: underline;">convert</span> del pacchetto imagemagik).<br />
In alternativa é sufficiente inviare in &#8220;Stampa su file&#8221; il documento pdf</p>
<p><strong>&#8230; e se proprio non riesco ad avere il postscript?</strong><br />
Se poi non c&#8217;é verso di creare il postscript, allora é possibile utilizzare l&#8217;utility <em>pdfbook</em><br />
Si tratta di un programma scritto in C che fa uso pero di LateX, pertanto, senza non può funzionare.<br />
Sono poche le distribuzioni che lo rendono disponibile pacchettizzato, ma la compilazione del programma non  é cosí complessa da far impazzire un utente con un minimo di esperienza.<br />
Basta scaricare i sorgenti dal sito <a href="http://www.ctan.org/tex-archive/support/pdfbook/">http://www.ctan.org/tex-archive/support/pdfbook/</a> e compilare usando il gcc (chiaramente, se non presente sul computer, c&#8217;é poco da fare).<br />
Ecco qui la sequenza di comandi per i più pigri.<br />
<code><br />
wget http://www.ctan.org/get/support/pdfbook.zip<br />
unzip pdfbook.zip<br />
cc -o pdfbook pdfbook.c<br />
sudo cp pdfbook /usr/bin<br />
</code><br />
Considerando poi <em>in_file.pdf</em> come pdf in ingresso e <em>booklet.pdf</em> come risultato, il comando da eseguire si riduce a<br />
<code>pdfbook -2 in_file.pdf booklet.pdf</code></p>
<p><strong>Infine &#8230; OpenOffice</strong><br />
Un documento in OpenOffice puo essere stampato a booklet seguendo questi comandi:<br />
<code>File -> Stampa -> Proprietà</code><br />
Cambiare il foglio da <em>Portrait</em> a <em>Landscape</em> premere <code>Ok</code><br />
Premere su <code>Extra</code>, scegliere la voce <em>Depliant</em>, confermare con un <code>Ok</code> e mandare in stampa</p>
<p>Alcuni consigli per la lettura</p>
<ul>
<li>Norma su dimensione fogli di carta http://it.wikipedia.org/wiki/ISO_216</li>
<li>Appunti di informatica libera: guida a psutils http://a2.pluto.it/a2273.htm</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://de.straba.us/2009/06/09/miniguida-alla-creazione-di-booklet-da-un-pdf-su-a4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Il LinuxTrent organizza un corso di bash shell :)</title>
		<link>http://de.straba.us/2009/02/09/il-linuxtrent-organizza-un-corso-di-bash-shell/</link>
		<comments>http://de.straba.us/2009/02/09/il-linuxtrent-organizza-un-corso-di-bash-shell/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 16:49:09 +0000</pubDate>
		<dc:creator>napo</dc:creator>
				<category><![CDATA[software libero]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[corsi]]></category>
		<category><![CDATA[linuxtrent]]></category>

		<guid isPermaLink="false">http://de.straba.us/?p=33</guid>
		<description><![CDATA[Dove? Trento &#8211; cooperativa Samuele c/o Villa Sant&#8217;Ignazio Via alle Laste 22 Quando? i 5 lunedì dal 9 marzo al 6 aprile. Dalle 20:30 alle 22:30 Come? Minimo 10 massimo 20 partecipanti Abbiamo a disposizione 6 pc che metteremo a disposizone ai primi che lo richiederanno all&#8217;iscrizione. Gli altri dovranno portarsi il proprio portatile che [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Dove?</strong><br />
Trento &#8211; cooperativa Samuele<br />
c/o Villa Sant&#8217;Ignazio<br />
Via alle Laste 22</p>
<p><strong>Quando?</strong><br />
i 5 lunedì dal 9 marzo al 6 aprile.<br />
Dalle 20:30 alle 22:30</p>
<p><strong>Come?</strong><br />
Minimo 10 massimo 20 partecipanti<br />
Abbiamo a disposizione 6 pc che metteremo a disposizone ai primi che lo richiederanno all&#8217;iscrizione. Gli altri dovranno portarsi il proprio portatile che dovrà essere dotato di scheda wireless. È utile ma non indispensabile avere un proprio sistema linux sul quale lavorare. Per chi non lo avesse sarà possibile usare via ssh un apposito sistema.</p>
<p><strong>Chi?</strong><br />
Il docente sarà Daniele Pizzolli, socio del LinuxTrent.</p>
<p><strong>Maggiori informazioni:</strong><br />
<a href="http://www.linuxtrent.it/corsi/corso-gnu-linux-da-linea-di-comando/">http://www.linuxtrent.it/corsi/corso-gnu-linux-da-linea-di-comando/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://de.straba.us/2009/02/09/il-linuxtrent-organizza-un-corso-di-bash-shell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bash shell in 30&#8243;</title>
		<link>http://de.straba.us/2008/08/19/bash-shell-in-30/</link>
		<comments>http://de.straba.us/2008/08/19/bash-shell-in-30/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 15:30:57 +0000</pubDate>
		<dc:creator>napo</dc:creator>
				<category><![CDATA[software libero]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://de.straba.us/?p=22</guid>
		<description><![CDATA[Variabili di ambiente PATH &#8211; definisce i percorsi dove trovare tutti i programmi eseguibili HOME &#8211; directory dell&#8217;utente MAIL &#8211; il file dove vengono archivate le email dell&#8217;utente IFS &#8211; contiene la stringa che viene utilizzata come separatore per le linee di comando. Il valore preimpostato e&#8217; uno spazio PS1 e PS2 &#8211; sono rispettivamente [...]]]></description>
			<content:encoded><![CDATA[<p><a name="variabili_di_ambiente"></a></p>
<h2>Variabili di ambiente</h2>
<p><code>PATH</code> &#8211; definisce i percorsi dove trovare tutti i programmi eseguibili<br />
<code>HOME</code> &#8211; directory dell&#8217;utente<br />
<code>MAIL</code> &#8211; il file dove vengono archivate le email dell&#8217;utente<br />
<code>IFS</code> &#8211; contiene la stringa che viene utilizzata come separatore per le linee di comando. Il valore preimpostato e&#8217; uno spazio<br />
<code>PS1</code> e <code>PS2</code> &#8211; sono rispettivamente il primo e il secondo prompt di bash. I valori preimpostati sono &#8220;<code>$</code>&#8221; per il primo e &#8220;<code>&gt;</code>&#8221; per il secondo<br />
<code>USER</code> &#8211; il nome della login utente<br />
<code>TERM</code> &#8211; indica il terminale utilizzato dall&#8217;utente (importante da impostare per alcuni editor testuali, es vi)<br />
<code>SHELL</code> &#8211; indica il tipo di shell utilizzata dall&#8217;utente<br />
<strong>Note:</strong></p>
<ul>
<li>per utilizzare il valore contenuto in una variabile si deve scrivere il simbolo <code>$</code> davanti al nome della variabile.<br />
Es.<br />
<code>echo $USER</code><br />
stampa il valore contenuto nella variabile <code>USER</code></li>
<li>l&#8217;assegnamento avviene con il nome della variabile, seguito dal simbolo &#8220;=&#8221; e successivamente dal valore da associare (meglio se fra virgolette).<br />
Es.<br />
<code>PATH="/usr/local/bin:$PATH"</code><br />
aggiunge alla variabile PATH il percorso <code>/usr/local/bin</code></li>
<li>le modifiche alle variabili d&#8217;ambiente possono essere rese persistenti se archiviate nel file <code>$HOME/.bashrc</code></li>
</ul>
<p><a name="regole_base_script"></a></p>
<h2>Regole di base per i file di script</h2>
<ul>
<li>iniziare sempre la prima riga con<br />
<code>#!/bin/bash </code><br />
serve ad indicare allo script il percorso assoluto della shell da eseguire</li>
<li> una volta creato il file di script occorre dare i permessi di esecuzione<br />
con<br />
<code>chmod ugo+x nome_dello_script.sh</code><br />
o con (forma compatta)<br />
<code>chmod </code></li>
<li>aggiungere al nome del file l&#8217;estensione <code>.sh</code>, non si tratta di una regola ma di una buona norma per far sapere che si tratta di uno script di shell</li>
</ul>
<p><a name="strutture_di_controllo"></a></p>
<h2>Strutture di controllo</h2>
<p><a name="if"></a><strong>il costrutto <em>if</em></strong><br />
valuta una condizione ed esegue un blocco di comandi<br />
<em>Sintassi:</em><br />
<code><strong>if</strong> <em>la_condizione_è_vera</em><br />
<strong>then</strong><br />
<em>operazioni da eseguire</em><br />
<strong>else</strong><br />
<em>operazioni da eseguire</em><br />
<strong>fi</strong></code><br />
e&#8217; possibile usare anche una forma piu&#8217; complessa qualora le condizioni sia di piu&#8217; usando questa forma<br />
<code><strong>if</strong> <em>la_condizione_è_soddisfatta</em><br />
<strong>then</strong><br />
<em>operazioni da eseguire</em><br />
<strong>elif</strong> <em>altra_condizione_soddisfatta</em><br />
<strong>then</strong><br />
<em>operazioni da eseguire</em><br />
<strong>else</strong><br />
<em>operazoni da eseguire</em><br />
<strong>fi</strong></code></p>
<p><em>Esempio</em><br />
<code><strong>if</strong> <em>grep "aiuto" testo.txt</em><br />
<strong>then</strong><br />
<em>echo "Ho trovato la parola che stavi cercando"</em><br />
<strong>else</strong><br />
<em>echo "Non ho trovato la parola che stavi cercando"</em><br />
<strong>fi</strong></code><br />
Il comando <em>grep &#8220;aiuto&#8221; testo.txt</em> restituisce <em>true</em> se trova la parola <em>aiuto</em> all&#8217;interno del file <em>testo.txt </em><br />
<a name="bash_test"></a></p>
<h2>i test</h2>
<p>test è una funziona interna della shell.<br />
Il test valuta la condizione posta alla sua destra e restituisce true o false in relazione al risultato.<br />
Esistono diverse tipologie di valutazione.<br />
Qui l&#8217;elenco<br />
<strong>operatori di confronto</strong><br />
<code><strong>-eq</strong> uguale a<br />
<strong>-lt</strong> minore di<br />
<strong>-le</strong> minore o uguale a<br />
<strong>-gt</strong> maggiore di<br />
<strong>-ge</strong> maggiore o uguale a<br />
</code><br />
<strong>operatori sui file</strong><br />
<code><strong>-f</strong> <em>nomefile</em> vero (true) se il file esiste<br />
<strong>-r</strong> <em>nomefile</em> vero (true) se il file esiste ed è leggibile<br />
<strong>-w</strong> <em>nomefile</em> vero (true) se il file esiste ed è scrivibile<br />
<strong>-x</strong> <em>nomefile</em> vero (true) se il file esiste ed è eseguibile<br />
<strong>-d</strong> <em>nomefile</em> vero (true) se si tratta di una directory<br />
<strong>-s</strong> <em>nomefile</em> vero (true) se il file esiste ed è maggiore di zero<br />
</code><br />
<strong>operatori sulle stringhe</strong><br />
<code><strong>-n</strong> <em>string</em> vero (true) se la stringa <em>string</em> non è una stringa nulla<br />
<strong>-z</strong> <em>string</em> vero (true) se la stringa <em>string</em> è nulla<br />
<strong><em>string1</em> == <em>string2</em></strong> vero (true) se entrambe le stringhe sono uguali<br />
<strong><em>string1</em> != <em>string2</em></strong> vero (true) se entrambe le stringhe sono diverse<br />
<strong><em>string</em></strong> vero (true) se alla stringa <em>string</em> è assegnato un valore non nullo<br />
</code><br />
attraverso questi <strong>operatori logici</strong> è possibile unire fra di loro piu&#8217; test<br />
<code><strong>-a</strong> corrisponde all'operatore <em>AND</em><br />
<strong>-o</strong> corrisponde all'operatore <em>OR</em><br />
</code><br />
<em>Esempi</em><br />
<code>d=12<br />
<strong>if</strong> <em>[ $d -eq 25]</em><br />
<strong>then</strong><br />
<em> echo "si"</em><br />
<strong>else</strong><br />
<em>echo "no il valore è $d"</em><br />
<strong>fi</strong></code><br />
se il valore della variabile <em>d</em> e&#8217; 25 allo scrivi &#8220;<em>si</em>&#8220;, altrimenti &#8220;<em>no</em>&#8221; assieme al valore contenuto<br />
<code><strong>if</strong> <em>[ $str1 == $str2 ]</em><br />
<strong>then</strong><br />
<em>echo "Le due stringhe sono uguali!"</em><br />
<strong>fi</strong><br />
</code><br />
Se il contenuto della stringa <em>str1</em> e&#8217; uguale a quello di <em>str2</em> allora scrivi <em>&#8220;Le due stringhe sono uguali&#8221;</em><br />
<code><br />
<strong>if</strong> <em>[ -n "$str1" -a -n "$str2" ]</em><br />
<strong>then</strong><br />
<em>echo 'sia $str1 che $str2 non sono nulli'</em><br />
<strong>fi</strong></code><br />
Se la string <em>str1</em> e la stringa <em>str2</em> non hanno valore nulli allora stampami il loro valori dichiarando che non sono nulli<br />
<strong>Note importanti sull&#8217;uso dei test</strong></p>
<ul>
<li>cio&#8217; che viene scritto fra parentesi quadre <em>[ ]</em> deve essere staccato da ciascuna parentesi con uno spazio</li>
<li>qualora si confrontino variabili contenenti stringhe si consiglia di scriverle fra virgolette<br />
es:<br />
<code>[ "$str1" == "$str2" ]</code></li>
</ul>
<p><a name="case"></a><strong>stuttura di controllo basata su casi <em>case</em></strong><br />
<em>Sintassi:</em><br />
<code><strong>case</strong> <em>espressione</em> <strong>in</strong><br />
<strong>valoreatteso1)</strong> <em>comandi da eseguire</em> <strong>;;</strong><br />
<strong>valoreatteso1</strong>) <em>comandi da eseguire</em> <strong>;;</strong><br />
<em>...</em><br />
<strong>esac</strong></code><br />
I possibili valori ammessi sono fra le parole chiave <em>case</em> e <em>esac</em>. Il doppio punto e virgola <em>;;</em> e&#8217; utilizzato come terminatore delle istruzioni.<br />
Il costrutto utilizza <em>)</em> per dividere il valore possibile dalla serie di istruzioni da eseguire.<br />
<em>Esempio</em><br />
<code><strong>echo</strong> "Fa la tua scelta : "<br />
<strong>read</strong> scelta;<br />
<strong>case</strong> $scelta <strong>in</strong><br />
<em><br />
1) ls -l ;;<br />
2) ps -aux ;;<br />
3) date ;;<br />
4) who ;;<br />
5) exit<br />
</em><br />
<strong>esac</strong></code><br />
In questo esempio viene chiesto l&#8217;input di una stringa che viene archiviato nella variabile <em>scelta</em> (<em>read scelta</em>)<br />
Se la stringa contiene uno dei casi proposti (i numeri da 1 a 5), lo script esegue il corrispettivo comando.<br />
Il comando <em>exit</em> esce dall&#8217;esecuzione della shell</p>
<h2>Cicli di controllo</h2>
<p><a name="while"></a><strong>cicli di controllo <em>while loop</em></strong><br />
<em>Sintassi:</em><br />
<code><strong>while</strong> la_condizione_è_vera<br />
<strong>do</strong><br />
<em>comandi da eseguire</em><br />
<strong>done</strong></code><br />
<em>Esempi:</em><br />
<code><strong>while</strong> <em>[ $num -gt 100 ]</em><br />
<strong>do</strong><br />
<em> sleep 5</em><br />
<strong>done</strong></code><br />
fino a che il valore contenuto nella variabile <em>num</em> è minore di 100 fa un attesa di 5 secondi <em>(sleep 5</em>)<br />
<a name="for&quot;"></a><strong>cicli di controllo <em>for</em></strong><br />
<em>Sintassi:</em><br />
<code><strong>for</strong> <em>variabile</em> <strong>in</strong> <em>lista</em><br />
<strong>do</strong><br />
<em>comandi_da_eseguire</em><br />
<strong>done</strong></code><br />
<em>Esempi:</em><br />
<code><strong>for</strong> <em>x</em> <strong>in</strong> <em>1 2 3 4 5</em><br />
<strong>do</strong><br />
<em> echo "il valore di x è $x";</em><br />
<strong>done</strong></code><br />
Stampa 5 volte la stringa &#8220;<em>il valore di x è</em> &#8230; &#8221; mostrando di volta in volta il valore assunto da <em>x</em> (ogni singolo valore della lista preso per volta)<br />
<code><br />
<strong>for</strong> <em>file</em> <strong>in</strong> <em>*~</em><br />
<strong>do</strong><br />
<strong>rm $file</strong><br />
<strong>done</strong></code><br />
Cerca tutti i file che finisco con &#8220;<em>~</em>&#8221; (<em>*~</em>) e li cancella uno alla volta (<em>rm $file</em>)</p>
<p><strong>Nota:</strong> il comando <em>break</em> interrompe in qualsiasi ciclo (sia <em>while</em> che <em>for</em>)</p>
<h2>Ulteriori informazioni utili</h2>
<ul>
<li>assegnare l&#8217;output di un comando ad una variabile<br />
<em>Sintassi:</em><br />
<code>VARIABILE=$(comando)</code><br />
in alternativa<br />
<code>VARIABILE=`comando`</code><br />
<em>Esempi:</em><br />
<code>SOMMA=$(echo 1+1 | bc)</code><br />
il valore contenuto in <em>SOMMA</em> sara&#8217; la somma di <em>1+1</em> calcolata dal programma <em>bc</em></p>
<p><code><strong>OGGI=`date '+%d/%m/%Y'`</strong></code><br />
Il valore contenuto in <em>OGGI</em> sara&#8217; la data espressa nella forma <em>giorno/mese/anno</em></li>
<li><strong>Variabili speciali</strong><br />
<code><br />
<strong>$1 ...  $n</strong> - i valori della sequenza dei parametri passati ad uno script si recuperano attraverso la lettura delle variabili (in sequenza) <em>$1, $2</em> ...<br />
<strong>$*</strong> - considera l'elenco di tutti parametri passati allo script<br />
<strong>$0</strong> - nome dello script eseguito<br />
<strong>$#</strong> - numero dei parametri passati allo script<br />
<strong>$?</strong> - stato di uscita dell'ultimo comando<br />
</code><br />
<em>Esempio:</em><br />
sorgente dello script <em>esempio.sh</em><br />
<code><strong>#!/bin/bash</strong><br />
<strong>echo</strong> "Mi sono stati passati <strong>$#</strong> valori"<br />
<strong>if</strong> <em>[ "$#" -gt 0 ]</em><br />
<strong>then</strong><br />
<strong>echo</strong> <em>"Il primo valore e' $1"</em><br />
<strong>fi</strong><br />
</code><br />
Uso<br />
<code>./esempio.sh 100 200</code><br />
Output<br />
<code>Mi sono stati passati 2 valori<br />
Il primo valore e' 100<br />
</code>
</li>
<li><strong>Gestione input/output</strong>
<ul>
<li>aggiungendo il simbolo &#8220;&gt;&#8221; seguito da un nome di un file a destra di un comando, l&#8217;output viene rediretto in un file sovrascrivendolo</li>
<li>aggiungendo il simbolo &#8220;&gt;&gt;&#8221; seguito da un nome di un file  a destra di un comando, l&#8217;output viene rediretto in un file accodandolo<br />
Esempi<br />
<code>echo "Hello" &gt; output.txt<br />
cat output.txt<br />
Hello</code><br />
<code><br />
echo "World" &gt;&gt; output.txt<br />
cat output.txt<br />
Hello<br />
World<br />
</code></li>
<liaggiungendo il simbolo "<em>&lt;</em>&#8221; seguito da un nome di un file a destra di un comando, si passa in input al comando il contenuto del file<br />
<code>mail nobody@where.no &lt; testo_email.txt</code></li>
<li>inserendo il simbolo &#8220;<em>|</em>&#8221; fra due comandi si passa l&#8217;output di uno come input dell&#8217;altro<br />
<code><br />
ls | more<br />
</code></li>
<li>creare un file di testo e il suo relativo contenuto<br />
<code>cat &gt; nomefile &lt;&lt; EOF<br />
testo da inserire<br />
EOF</code><br />
<strong>Nota</strong>: nel file si troveranno le stringhe contenute fra le due parole chiave EOF (escluse)<br />
Puo&#8217; essere usata una qualsiasi parola chiave a patto che venga ripetuta come chiusura</li>
</ul>
<p>Sito da cui e&#8217; stato liberamente tradotto e modificato questo post<br />
<a href="http://linuxhelp.blogspot.com/2005/10/10-seconds-guide-to-bash-shell.html">http://linuxhelp.blogspot.com/2005/10/10-seconds-guide-to-bash-shell.html</a></p>
<p>Altri link interessanti</p>
<ul>
<li><a href="http://linuxhelp.blogspot.com/2005/08/bash-shell-shortcuts.html">http://linuxhelp.blogspot.com/2005/08/bash-shell-shortcuts.html</a></li>
<li><a href="http://www.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures/lsst">http://www.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures/lsst</a></li>
<li><a href="http://bashcurescancer.com/10-steps-to-beautiful-shell-scripts.html">http://bashcurescancer.com/10-steps-to-beautiful-shell-scripts.html</a></li>
<li><a href="http://steve-parker.org/sh/trap.shtml">http://steve-parker.org/sh/trap.shtml</a></li>
<li><a href="http://www.tldp.org/LDP/abs/html/">http://www.tldp.org/LDP/abs/html/</a></li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://de.straba.us/2008/08/19/bash-shell-in-30/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

