Forums

Skip to content

Advanced search
  • Quick links
    • Unanswered topics
    • Active topics
    • Search
  • FAQ
  • Login
  • Register
  • Board index International Gentoo Users Forum italiano (Italian) Risorse italiane (documentazione e tools)
  • Search

[TIPS] Bash scripting, raccolta di consigli

Forum riservato alla documentazione in italiano.

Moderator: ago

Post Reply
  • Print view
Advanced search
17 posts • Page 1 of 1
Author
Message
Dhaki
Guru
Guru
User avatar
Posts: 325
Joined: Wed Jun 16, 2004 3:23 pm
Location: Ticino - CH

[TIPS] Bash scripting, raccolta di consigli

  • Quote

Post by Dhaki » Thu Jul 28, 2005 3:06 pm

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: Select all

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: Select all

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: Select all

#!/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: Select all

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.
Top
nick_spacca
l33t
l33t
User avatar
Posts: 689
Joined: Sat May 29, 2004 2:36 pm
Location: Paris/France
Contact:
Contact nick_spacca
Website

  • Quote

Post by nick_spacca » Thu Jul 28, 2005 3:34 pm

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)
Top
Dhaki
Guru
Guru
User avatar
Posts: 325
Joined: Wed Jun 16, 2004 3:23 pm
Location: Ticino - CH

  • Quote

Post by Dhaki » Thu Jul 28, 2005 3:41 pm

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
Top
Sasdo
Guru
Guru
User avatar
Posts: 542
Joined: Wed Feb 18, 2004 3:08 pm
Location: 44.476474,11.644446 circa.

Re: [TIPS] Bash scripting, raccolta di consigli

  • Quote

Post by Sasdo » Thu Jul 28, 2005 4:14 pm

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: Select all

/usr/local/bin/
?
LinuxUser #362518
--
Ochei lo ammetto: il mio cervello lo tengo in frigo.
Top
Dhaki
Guru
Guru
User avatar
Posts: 325
Joined: Wed Jun 16, 2004 3:23 pm
Location: Ticino - CH

Re: [TIPS] Bash scripting, raccolta di consigli

  • Quote

Post by Dhaki » Thu Jul 28, 2005 5:21 pm

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: Select all

/usr/local/bin/
?
Sinceramente pensavo fosse anche usato da programmi normali, ma si, si può usare quello. Correggo.
Top
syntaxerrormmm
Guru
Guru
User avatar
Posts: 449
Joined: Sun Apr 17, 2005 8:43 am
Location: Romano di Lombardia - BG - ITALY
Contact:
Contact syntaxerrormmm
Website

  • Quote

Post by syntaxerrormmm » Thu Jul 28, 2005 6:26 pm

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
Top
Sasdo
Guru
Guru
User avatar
Posts: 542
Joined: Wed Feb 18, 2004 3:08 pm
Location: 44.476474,11.644446 circa.

  • Quote

Post by Sasdo » Thu Jul 28, 2005 6:29 pm

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.
Top
randomaze
Bodhisattva
Bodhisattva
User avatar
Posts: 9985
Joined: Tue Oct 21, 2003 7:55 am
Contact:
Contact randomaze
Website

  • Quote

Post by randomaze » Thu Jul 28, 2005 8:51 pm

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

Code: Select all

# 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!
Top
silian87
Advocate
Advocate
User avatar
Posts: 2318
Joined: Mon Oct 06, 2003 7:12 pm
Location: Treviso, Italy
Contact:
Contact silian87
Website

  • Quote

Post by silian87 » Fri Jul 29, 2005 8:45 am

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

7) Prendere gli argomenti in stile C/C++

Code: Select all

#!/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: Select all

function nome_funzione { istruzioni }
Secondo:

Code: Select all

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: Select all

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: Select all

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: Select all

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: Select all

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: Select all

variable="ciao ahhaa"
echo "${variable}" | sed -e s/a/e/
Semplicissimo.
Se volessimo sostituire TUTTE le "a", aggiungiamo il tag "g". Vediamo

Code: Select all

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: Select all

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: Select all

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 ... 87-faq.txt

GTalk: silian87@gmail.com
Top
diego_82
Apprentice
Apprentice
User avatar
Posts: 257
Joined: Sun May 02, 2004 8:10 am
Location: Londra

  • Quote

Post by diego_82 » Fri Jul 29, 2005 9:58 am

Grazie! Davvero utile :D
Top
cloc3
Advocate
Advocate
User avatar
Posts: 4845
Joined: Tue Jan 13, 2004 10:09 am
Location: http://www.gentoo-users.org/user/cloc3/
Contact:
Contact cloc3
Website

  • Quote

Post by cloc3 » Wed Aug 22, 2007 7:25 am

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

Code: Select all

stringa="parolamoltolunga"
echo ${stringa:6:5}
con i ringraziamenti dovuti a Fonderia Digitale.
vu vu vu
gentù
mi piaci tu
Top
codadilupo
Advocate
Advocate
Posts: 3135
Joined: Tue Aug 05, 2003 8:48 am

Re: [TIPS] Bash scripting, raccolta di consigli

  • Quote

Post by codadilupo » Wed Aug 22, 2007 8:00 am

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
Top
gutter
Bodhisattva
Bodhisattva
User avatar
Posts: 7162
Joined: Sat Mar 13, 2004 10:37 pm
Location: Aarau, Aargau, Switzerland
Contact:
Contact gutter
Website

Re: [TIPS] Bash scripting, raccolta di consigli

  • Quote

Post by gutter » Wed Aug 22, 2007 8:09 am

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
Top
codadilupo
Advocate
Advocate
Posts: 3135
Joined: Tue Aug 05, 2003 8:48 am

  • Quote

Post by codadilupo » Wed Aug 22, 2007 10:46 am

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

Coda
Top
cloc3
Advocate
Advocate
User avatar
Posts: 4845
Joined: Tue Jan 13, 2004 10:09 am
Location: http://www.gentoo-users.org/user/cloc3/
Contact:
Contact cloc3
Website

  • Quote

Post by cloc3 » Wed Aug 22, 2007 11:16 am

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
Top
randomaze
Bodhisattva
Bodhisattva
User avatar
Posts: 9985
Joined: Tue Oct 21, 2003 7:55 am
Contact:
Contact randomaze
Website

  • Quote

Post by randomaze » Wed Aug 22, 2007 2:05 pm

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!
Top
codadilupo
Advocate
Advocate
Posts: 3135
Joined: Tue Aug 05, 2003 8:48 am

  • Quote

Post by codadilupo » Wed Aug 22, 2007 7:37 pm

randomaze wrote:Nel PATH non viene messa la directory corrente (il '.') non la HOME (la '~').
giusto! sorry, ricordavo male :-P

Coda
Top
Post Reply
  • Print view

17 posts • Page 1 of 1

Return to “Risorse italiane (documentazione e tools)”

Jump to
  • Assistance
  • ↳   News & Announcements
  • ↳   Frequently Asked Questions
  • ↳   Installing Gentoo
  • ↳   Multimedia
  • ↳   Desktop Environments
  • ↳   Networking & Security
  • ↳   Kernel & Hardware
  • ↳   Portage & Programming
  • ↳   Gamers & Players
  • ↳   Other Things Gentoo
  • ↳   Unsupported Software
  • Discussion & Documentation
  • ↳   Documentation, Tips & Tricks
  • ↳   Gentoo Chat
  • ↳   Gentoo Forums Feedback
  • ↳   Duplicate Threads
  • International Gentoo Users
  • ↳   中文 (Chinese)
  • ↳   Dutch
  • ↳   Finnish
  • ↳   French
  • ↳   Deutsches Forum (German)
  • ↳   Diskussionsforum
  • ↳   Deutsche Dokumentation
  • ↳   Greek
  • ↳   Forum italiano (Italian)
  • ↳   Forum di discussione italiano
  • ↳   Risorse italiane (documentazione e tools)
  • ↳   Polskie forum (Polish)
  • ↳   Instalacja i sprzęt
  • ↳   Polish OTW
  • ↳   Portuguese
  • ↳   Documentação, Ferramentas e Dicas
  • ↳   Russian
  • ↳   Scandinavian
  • ↳   Spanish
  • ↳   Other Languages
  • Architectures & Platforms
  • ↳   Gentoo on ARM
  • ↳   Gentoo on PPC
  • ↳   Gentoo on Sparc
  • ↳   Gentoo on Alternative Architectures
  • ↳   Gentoo on AMD64
  • ↳   Gentoo for Mac OS X (Portage for Mac OS X)
  • Board index
  • All times are UTC
  • Delete cookies

© 2001–2026 Gentoo Authors
Gentoo is a trademark of the Gentoo Foundation, Inc. and of Förderverein Gentoo e.V.
The contents of this document, unless otherwise expressly stated, are licensed under the CC-BY-SA-4.0 license.
The Gentoo Name and Logo Usage Guidelines apply.

Powered by phpBB® Forum Software © phpBB Limited

Privacy Policy