View previous topic :: View next topic |
Author |
Message |
Dhaki Guru
Joined: 16 Jun 2004 Posts: 325 Location: Ticino - CH
|
Posted: Thu Jul 28, 2005 3:06 pm Post subject: [TIPS] Bash scripting, raccolta di consigli |
|
|
Allora! Ho pensato che potrebbe essere interessante raccogliere tutti i suggerimenti sull'arte () di scrivere bash script, dato che mi sono personalmente sempre tornati molto utili. Commincio io, continuate voi
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 |
|
|
nick_spacca l33t
Joined: 29 May 2004 Posts: 689 Location: Paris/France
|
Posted: Thu Jul 28, 2005 3:34 pm Post subject: |
|
|
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 |
|
|
Dhaki Guru
Joined: 16 Jun 2004 Posts: 325 Location: Ticino - CH
|
Posted: Thu Jul 28, 2005 3:41 pm Post subject: |
|
|
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 . 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 |
|
|
Sasdo Guru
Joined: 18 Feb 2004 Posts: 542 Location: 44.476474,11.644446 circa.
|
Posted: Thu Jul 28, 2005 4:14 pm Post subject: Re: [TIPS] Bash scripting, raccolta di consigli |
|
|
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 ? _________________ LinuxUser #362518
--
Ochei lo ammetto: il mio cervello lo tengo in frigo. |
|
Back to top |
|
|
Dhaki Guru
Joined: 16 Jun 2004 Posts: 325 Location: Ticino - CH
|
Posted: Thu Jul 28, 2005 5:21 pm Post subject: Re: [TIPS] Bash scripting, raccolta di consigli |
|
|
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 ? |
Sinceramente pensavo fosse anche usato da programmi normali, ma si, si può usare quello. Correggo. |
|
Back to top |
|
|
syntaxerrormmm Guru
Joined: 17 Apr 2005 Posts: 449 Location: Romano di Lombardia - BG - ITALY
|
Posted: Thu Jul 28, 2005 6:26 pm Post subject: |
|
|
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 |
|
|
Sasdo Guru
Joined: 18 Feb 2004 Posts: 542 Location: 44.476474,11.644446 circa.
|
Posted: Thu Jul 28, 2005 6:29 pm Post subject: |
|
|
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 |
|
|
randomaze Bodhisattva
Joined: 21 Oct 2003 Posts: 9985
|
Posted: Thu Jul 28, 2005 8:51 pm Post subject: |
|
|
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 |
|
|
silian87 Advocate
Joined: 06 Oct 2003 Posts: 2318 Location: Treviso, Italy
|
Posted: Fri Jul 29, 2005 8:45 am Post subject: |
|
|
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 } |
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 .
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 .
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: :
1) http://it.tldp.org/guide/abs/
2)
3) Venite a vedere il mio talk sul bash scripting al linux day di Treviso
4) http://www.google.it
Adios _________________ 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 |
|
|
diego_82 Apprentice
Joined: 02 May 2004 Posts: 257 Location: Londra
|
Posted: Fri Jul 29, 2005 9:58 am Post subject: |
|
|
Grazie! Davvero utile |
|
Back to top |
|
|
cloc3 Advocate
Joined: 13 Jan 2004 Posts: 4810 Location: http://www.gentoo-users.org/user/cloc3/
|
Posted: Wed Aug 22, 2007 7:25 am Post subject: |
|
|
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 |
|
|
codadilupo Advocate
Joined: 05 Aug 2003 Posts: 3135
|
Posted: Wed Aug 22, 2007 8:00 am Post subject: Re: [TIPS] Bash scripting, raccolta di consigli |
|
|
Dhaki wrote: | Allora! Ho pensato che potrebbe essere interessante raccogliere tutti i suggerimenti sull'arte () di scrivere bash script, dato che mi sono personalmente sempre tornati molto utili. Commincio io, continuate voi
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 ... e tu manco te ne accorgi, visto che è nel PATH... uhmmm.. non mi sembra azzecata come mossa
Coda |
|
Back to top |
|
|
gutter Bodhisattva
Joined: 13 Mar 2004 Posts: 7162 Location: Aarau, Aargau, Switzerland
|
Posted: Wed Aug 22, 2007 8:09 am Post subject: Re: [TIPS] Bash scripting, raccolta di consigli |
|
|
codadilupo wrote: |
si', e se ti fregano la password di utente, finisci che ti ci mettono dentro un keylogger al posto di bash ... e tu manco te ne accorgi, visto che è nel PATH... uhmmm.. non mi sembra azzecata come mossa
|
Se ti fregano la password di utente possono sempre creare la dir e metterla nel PATH . Non penso cambi molto _________________ Registered as User #281564 and Machines #163761 |
|
Back to top |
|
|
codadilupo Advocate
Joined: 05 Aug 2003 Posts: 3135
|
Posted: Wed Aug 22, 2007 10:46 am Post subject: |
|
|
questo è vero, ma è proprio il motivo per cui nel path non c'e' mai la home.. quindi perchè rimettercela ?
Coda |
|
Back to top |
|
|
cloc3 Advocate
Joined: 13 Jan 2004 Posts: 4810 Location: http://www.gentoo-users.org/user/cloc3/
|
Posted: Wed Aug 22, 2007 11:16 am Post subject: |
|
|
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 |
|
|
randomaze Bodhisattva
Joined: 21 Oct 2003 Posts: 9985
|
Posted: Wed Aug 22, 2007 2:05 pm Post subject: |
|
|
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 |
|
|
codadilupo Advocate
Joined: 05 Aug 2003 Posts: 3135
|
Posted: Wed Aug 22, 2007 7:37 pm Post subject: |
|
|
randomaze wrote: | Nel PATH non viene messa la directory corrente (il '.') non la HOME (la '~'). |
giusto! sorry, ricordavo male
Coda |
|
Back to top |
|
|
|