Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[TIPS] Bash scripting, raccolta di consigli
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools)
View previous topic :: View next topic  
Author Message
Dhaki
Guru
Guru


Joined: 16 Jun 2004
Posts: 325
Location: Ticino - CH

PostPosted: Thu Jul 28, 2005 3:06 pm    Post subject: [TIPS] Bash scripting, raccolta di consigli Reply with quote

Allora! Ho pensato che potrebbe essere interessante raccogliere tutti i suggerimenti sull'arte (:D) di scrivere bash script, dato che mi sono personalmente sempre tornati molto utili. Commincio io, continuate voi :wink:

1) Raccogliere gli script in una dir e inserirla nel PATH
Aiuta molto nell'ordine. Una possibilità (standard, diciamo, dato che già inculso nel PATH (vedi /etc/profile.env)) é usare /usr/local/bin, l'altra é creare la cartella ~/bin dove metto tutti i miei script, quindi l'ho aggiunta alla variabile PATH solo per il mio utente (mettendo "export PATH="$PATH:/home/emo/bin" nel .bashrc)

2) Eseguire gli script in modalità debug
In genere gli script iniziano con #!/bin/bash (o #!/bin/sh). Bene, mettendo -x come argomento, il nostro script verrà eseguito in modalità debug. Esempio:
Code:
emo@Dune ~ $ ./script.sh
+ echo Hello World
Hello World
emo@Dune ~ $ cat script.sh
#!/bin/bash -x
echo Hello World
emo@Dune ~ $


3) Leggete altri scripti
Il che aiuta molto a migliorare lo stile. Un simpatico comando che potete usare per trovare tutti gli script presenti nel vostro sistema:
Code:
for i in $( echo $PATH | sed 's/:/\ /g' ); do for a in $i/*; do if [[ -f $a ]] && [[ -r $a ]]; then if [[ "x$( cat $a | grep "#\!/bin/bash" )" != "x" ]] || [[ "x$( cat $a | grep "#\!/bin/sh" )" != "x" ]]; then echo $a && echo $a >> /home/$USER/lista.sh; fi; fi; done; done


4) Usare le funzioni
Usare delle funzioni (con function) può aiutare a mantere il codice leggibile e mantenibile. Nel caso di un operazione ripetuta più volte, le funzioni tornano molto comode. Un esempio di raccolta di funzioni che penso sia molto conosciuto é /sbin/functions.sh.
Esempio:
Code:
#!/bin/bash
function print {
   echo $1
}
print ciao
exit


5) Riusare le funzioni
Ovvero, non é opersource per nulla, no? Quindi, se trovate in uno script una funzione che vi piace (o anche solo una porzione di codice), perché non riusarla (magari citandone la fonte o ringraziando l'autore)? Ho pensato che potrebbe essere utile anche segnalarle qua.


/bin/rc-status: serve a controllare tutti gli argomenti da linea di comando
Code:
do_opt() {
        case $1 in
                --all|-a)
                        ALL=true
                        ;;
                --depend)
                        DEPEND=true
                        ;;
                --unused|-u)
                        ALL=true
                        UNUSED=true
                        ;;
                --list|-l)
                        ls -1 ${runleveldir}
                        exit 0
                        ;;
                --help|-h|-*)
                        echo "USAGE: $0 [--all | --list | --unused | <runlevel>]"
                        echo "  --all      -a  Show services at all run levels"
                        echo "  --list     -l  Show list of run levels"
                        echo "  --unused   -u  Show services not assigned to any run level"
                        echo "  <runlevel>     Show services assigned to <runlevel>"
                        echo "If no arguments are supplied, shows services for current run level."
                        exit 0
                        ;;
                *)
                        runlevel=$1
                        ;;
        esac
}
for opt in "$@" ; do
        do_opt ${opt}
        [ -n "$2" ] && shift
done


6) Commentate!
Commentate molto i vostri script con #. Vi assicuro che aiuta sia voi (in futuro) che gli altri a capirli più in fretta.

Pensate sia utile una raccolta del genere?


Last edited by Dhaki on Thu Jul 28, 2005 5:26 pm; edited 2 times in total
Back to top
View user's profile Send private message
nick_spacca
l33t
l33t


Joined: 29 May 2004
Posts: 689
Location: Paris/France

PostPosted: Thu Jul 28, 2005 3:34 pm    Post subject: Reply with quote

Bravo...mi sembra una cosa DECISAMENTE utile...
Si potrebbe usare questo thread per aggiungere ognuno i propri tips sullo scripting bash!
_________________
I can resist anything but temptation.
(O. Wilde)
Back to top
View user's profile Send private message
Dhaki
Guru
Guru


Joined: 16 Jun 2004
Posts: 325
Location: Ticino - CH

PostPosted: Thu Jul 28, 2005 3:41 pm    Post subject: Reply with quote

nick_spacca wrote:
Bravo...mi sembra una cosa DECISAMENTE utile...
Si potrebbe usare questo thread per aggiungere ognuno i propri tips sullo scripting bash!

Intanto grazie :D . In ogni caso voleva appunto essere una raccolta non solo dei miei ma di tutti i tips.

/me modifica il primo post
Back to top
View user's profile Send private message
Sasdo
Guru
Guru


Joined: 18 Feb 2004
Posts: 542
Location: 44.476474,11.644446 circa.

PostPosted: Thu Jul 28, 2005 4:14 pm    Post subject: Re: [TIPS] Bash scripting, raccolta di consigli Reply with quote

Dhaki wrote:

1) Raccogliere gli script in una dir e inserirla nel PATH
Aiuta molto nell'ordine. Dato che non mi piace mettere gli script in /usr/bin o simili, ho pensato di creare la cartella ~/bin dove metto tutti i miei script, quindi l'ho aggiunta alla variabile PATH solo per il mio utente (mettendo "export PATH="$PATH:/home/emo/bin" nel .bashrc)


Per cose di questo tipo non esiste apposta
Code:
/usr/local/bin/
?
_________________
LinuxUser #362518
--
Ochei lo ammetto: il mio cervello lo tengo in frigo.
Back to top
View user's profile Send private message
Dhaki
Guru
Guru


Joined: 16 Jun 2004
Posts: 325
Location: Ticino - CH

PostPosted: Thu Jul 28, 2005 5:21 pm    Post subject: Re: [TIPS] Bash scripting, raccolta di consigli Reply with quote

Sasdo wrote:
Dhaki wrote:

1) Raccogliere gli script in una dir e inserirla nel PATH
Aiuta molto nell'ordine. Dato che non mi piace mettere gli script in /usr/bin o simili, ho pensato di creare la cartella ~/bin dove metto tutti i miei script, quindi l'ho aggiunta alla variabile PATH solo per il mio utente (mettendo "export PATH="$PATH:/home/emo/bin" nel .bashrc)


Per cose di questo tipo non esiste apposta
Code:
/usr/local/bin/
?

Sinceramente pensavo fosse anche usato da programmi normali, ma si, si può usare quello. Correggo.
Back to top
View user's profile Send private message
syntaxerrormmm
Guru
Guru


Joined: 17 Apr 2005
Posts: 449
Location: Romano di Lombardia - BG - ITALY

PostPosted: Thu Jul 28, 2005 6:26 pm    Post subject: Reply with quote

Io credo che in /usr/local/bin ci vadano gli script che siano stati scritti esplicitamente per tutti gli utenti di una certa macchina. Se è uno script che serve solo a te perché solo tu rippi i DVD con mencoder ( :) ) allora va in ~/bin.

Ciao.
_________________
"Every rule can be broken, but no rule may be ignored."

Last.fm - Gentoo 2006.1 on:
Acer Aspire 1355LC - suspend2-sources-2.6.18-r3
IBM Thinkpad T30 - suspend2-sources-2.6.19-r3
Back to top
View user's profile Send private message
Sasdo
Guru
Guru


Joined: 18 Feb 2004
Posts: 542
Location: 44.476474,11.644446 circa.

PostPosted: Thu Jul 28, 2005 6:29 pm    Post subject: Reply with quote

syntaxerrormmm wrote:
Io credo che in /usr/local/bin ci vadano gli script che siano stati scritti esplicitamente per tutti gli utenti di una certa macchina. Se è uno script che serve solo a te perché solo tu rippi i DVD con mencoder ( :) ) allora va in ~/bin.

Ciao.


Sì, è giusto quel che dici, è che tendo sempre a non considerare la multiutenza dato che a casa mia linuccio lo uso solo io...
_________________
LinuxUser #362518
--
Ochei lo ammetto: il mio cervello lo tengo in frigo.
Back to top
View user's profile Send private message
randomaze
Bodhisattva
Bodhisattva


Joined: 21 Oct 2003
Posts: 9985

PostPosted: Thu Jul 28, 2005 8:51 pm    Post subject: Reply with quote

Un must (o una FAQ, scegli pure...):

Code:
# Load .bashrc (if present)
[ -f ~/.bashrc ] && source .bashrc


...tanto prima o poi arriverá qualcuno a chiede come mai non carica il .bashrc ;-)
_________________
Ciao da me!
Back to top
View user's profile Send private message
silian87
Advocate
Advocate


Joined: 06 Oct 2003
Posts: 2318
Location: Treviso, Italy

PostPosted: Fri Jul 29, 2005 8:45 am    Post subject: Reply with quote

Non so, io scripto parecchio, vediamo se mi vengono in mente consigli...

7) Prendere gli argomenti in stile C/C++
Code:
#!/bin/bash

verbose ()
{
   echo verbose
}

version ()
{
   echo version
}

counter ()
{
   echo counter
}

for arg in "${@}"; do
   if [ "${arg}" = "-v" ] || [ "${arg}" = "--verbose" ]; then
      verbose # Chiama la funzione corrispondente o setta delle variabili
   elif
      [ "${arg}" = "-V" ] || [ "${arg}" = "--version" ]; then
      version # Idem :D
   elif
      [ "${arg}" = "-c" ] || [ "${arg}" = "--counter" ]; then
      counter # ;-)
   fi
done



Cosi' chiamando la funzione con i vari parametri possiamo ottenere comportamenti diversi.
Avete inoltre visto da questo esempio che ci sono due modi per definire una funzione:
Primo:
Code:
function nome_funzione { istruzioni }

Secondo:
Code:
nome_funzione () { istruzioni }


8) Prendere gli argomenti di uno script o di una funzione normalmente
Questo e' il modo standard per prendere gli argomenti che vengono passati ad uno script o una funzione. Vediamo un esempio:

./prova.sh A B C D E F
Code:

script_name="${0}"
arg1="${1}"
arg2="${2}"
arg3="${3}"
arg3="${4}"
arg3="${5}"
arg3="${6}"

Cosi' avremo memorizzato i vari parametri nelle variabili. E' meglio farlo subito, perche' un semplice set potrebbe sovrascrivere i valori.

In una funzione e' ancora semplicissimo
Code:

local arg1="${1}"
local arg1="${2}"
local arg1="${3}"

Io dichiaro sempre le variabili di una funzione come locali, per evitare che interferiscano con altre variabili (sopratutto i contatori). Le uniche che dichiaro globali sono quelle che devo ritornare, di solito.

9) Lavorare con le stringhe (primo approcio): set, for, sed
Quando avrete imparato ocme usare questi tre comandi, virtualmente potete fare tutto :D.

Vediamo come usare set.
Set separa la stringa usando come separator il valore contenuto nella variabile $IFS che normalmente e' " ".
Code:

variabile="ciao come va?, a me maluccio"
set -- ${variabile}
echo $1
echo $2
echo $3
echo $4
echo $6
echo $7

Otterremo riga su riga tutte le parole della frase.

Se volessimo separare una stringa ogni volta che troviamo "/" bastera' modificare il valore di IFS a / (ricordandoci di risistemarlo poi).

Anche il for usa IFS come variabile, vediamo un esempio.
Code:

dove=`pwd`
IFS="/"
for i in ${dove}; do
   echo "${i}"
done


In questo modo abbiamo anche introdotto gli apici inversi `, che servono per mettere il risultato del comando nella variabile. In questo caso il comando pwd ritorna il percorso dove viene eseguito lo script. Dopo il for per ogni valore che sta tra "/" separa la stringa e lo stampa, perche' abbiamo messo un echo.

Capite che ci si puo' fare di tutto!

Di sed io accenno solo al mitico "s". Con un "s" ci fate di tutto.

Il comando serve per sostituire un carattere con un altro. Vediamo come separare la prima "a" di unam stringa con una "e"
Code:

variable="ciao ahhaa"
echo "${variable}" | sed -e s/a/e/


Semplicissimo.
Se volessimo sostituire TUTTE le "a", aggiungiamo il tag "g". Vediamo
Code:

echo "${variable}" | sed -e s/a/e/g"


Semplice :wink: .

In caso che un carattere non venisse riconosciuto provate ad inserirlo tra le quadre. Per "/" per esempio si va [/].

10) Array

Gestire gli array in bash e' semplicissimo! Sono anche dinamici. Vediamo dei semplici esempi:

Code:

c=0
for i in `ls /usr/bin`; do
   binario[${c}]="${i}"
   let c++
done


Questo banale script non fa altro che mettere ogni binario in /usr/bin in un elemento dell'array, che poi stampero' semplicmente con un "echo binario[6]" per esempio.
Avete anche visto "let" che ho usato in C style per incrementare il contatore.

11) Cose non fatte ed altre risorse
Ora sono un po' stancuccio..... ci vorrebbe la spiegazione della redirezione dell'I/O dei for in C-style, e di tante altre cosuccie.

Se volete imparare tutto vi consiglio di........ RTFM:evil: :evil: :twisted: :
1) http://it.tldp.org/guide/abs/
2)
Code:
man $comando

3) Venite a vedere il mio talk sul bash scripting al linux day di Treviso :lol:
4) http://www.google.it

Adios :oops:
_________________
Musica che ascolto: http://www.last.fm/user/silian87/

Silian87 FAQs: http://marentax.homelinux.org/~silian87/silian87-faq.txt

GTalk: silian87@gmail.com
Back to top
View user's profile Send private message
diego_82
Apprentice
Apprentice


Joined: 02 May 2004
Posts: 257
Location: Londra

PostPosted: Fri Jul 29, 2005 9:58 am    Post subject: Reply with quote

Grazie! Davvero utile :D
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4516
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Wed Aug 22, 2007 7:25 am    Post subject: Reply with quote

una minitip interessante è quella per estrarre sottostringhe da una variabile bash:
Code:

stringa="parolamoltolunga"
echo ${stringa:6:5}


con i ringraziamenti dovuti a Fonderia Digitale.
_________________
vu vu vu
gentù
mi piaci tu
Back to top
View user's profile Send private message
codadilupo
Advocate
Advocate


Joined: 05 Aug 2003
Posts: 3134

PostPosted: Wed Aug 22, 2007 8:00 am    Post subject: Re: [TIPS] Bash scripting, raccolta di consigli Reply with quote

Dhaki wrote:
Allora! Ho pensato che potrebbe essere interessante raccogliere tutti i suggerimenti sull'arte (:D) di scrivere bash script, dato che mi sono personalmente sempre tornati molto utili. Commincio io, continuate voi :wink:

1) Raccogliere gli script in una dir e inserirla nel PATH
Aiuta molto nell'ordine. creare la cartella ~/bin dove metto tutti i miei script, quindi l'ho aggiunta alla variabile PATH solo per il mio utente (mettendo "export PATH="$PATH:/home/emo/bin" nel .bashrc)


si', e se ti fregano la password di utente, finisci che ti ci mettono dentro un keylogger al posto di bash :-P... e tu manco te ne accorgi, visto che è nel PATH... uhmmm.. non mi sembra azzecata come mossa :-P

Coda
Back to top
View user's profile Send private message
gutter
Moderator
Moderator


Joined: 13 Mar 2004
Posts: 7160
Location: Aarau, Aargau, Switzerland

PostPosted: Wed Aug 22, 2007 8:09 am    Post subject: Re: [TIPS] Bash scripting, raccolta di consigli Reply with quote

codadilupo wrote:

si', e se ti fregano la password di utente, finisci che ti ci mettono dentro un keylogger al posto di bash :-P... e tu manco te ne accorgi, visto che è nel PATH... uhmmm.. non mi sembra azzecata come mossa :-P


Se ti fregano la password di utente possono sempre creare la dir e metterla nel PATH :P. Non penso cambi molto :wink:
_________________
Registered as User #281564 and Machines #163761
Back to top
View user's profile Send private message
codadilupo
Advocate
Advocate


Joined: 05 Aug 2003
Posts: 3134

PostPosted: Wed Aug 22, 2007 10:46 am    Post subject: Reply with quote

questo è vero, ma è proprio il motivo per cui nel path non c'e' mai la home.. quindi perchè rimettercela ;-) ?

Coda
Back to top
View user's profile Send private message
cloc3
Advocate
Advocate


Joined: 13 Jan 2004
Posts: 4516
Location: http://www.gentoo-users.org/user/cloc3/

PostPosted: Wed Aug 22, 2007 11:16 am    Post subject: Reply with quote

codadilupo wrote:
ma è proprio il motivo per cui nel path non c'e' mai la home..

non credo sia questo il motivo.

semmai, nei sistemi di grosse dimensioni, l'amministratore monta la home su una partizione noexec.
in tal caso, metterla nel path diventa inutile.

ma non è il caso di uno sviluppatore come Dhaki che testa i propri progetti nella cartella utente.
_________________
vu vu vu
gentù
mi piaci tu
Back to top
View user's profile Send private message
randomaze
Bodhisattva
Bodhisattva


Joined: 21 Oct 2003
Posts: 9985

PostPosted: Wed Aug 22, 2007 2:05 pm    Post subject: Reply with quote

codadilupo wrote:
questo è vero, ma è proprio il motivo per cui nel path non c'e' mai la home.. quindi perchè rimettercela ;-) ?


Nel PATH non viene messa la directory corrente (il '.') non la HOME (la '~').

Questo perché un utente malizioso (o un cracker) potrebbe facilmente mettere il suo script tarocco nella /tmp o in altre directory comuni e attendere.
Quella della home non la ho mai sentita....
_________________
Ciao da me!
Back to top
View user's profile Send private message
codadilupo
Advocate
Advocate


Joined: 05 Aug 2003
Posts: 3134

PostPosted: Wed Aug 22, 2007 7:37 pm    Post subject: Reply with quote

randomaze wrote:
Nel PATH non viene messa la directory corrente (il '.') non la HOME (la '~').


giusto! sorry, ricordavo male :-P

Coda
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum