Newsgroup: it.comp.os.linux.iniziare
Titolo: Help... come si fa uno script?

Ciao a tutti,
sono davvero una novizia di Linux e sto cercando di imparare qualcosa...
visto che a giugno dovrei dare un esame su unix/linux...
La prof. ha dato questo esercizio, magari semplice, ma per me molto
complesso... chi mi aiuta?
Devo creare uno script che abbia la sintassi:
./ps_monitor.sh [up|down]
Lo script deve mostrare i processi di tutti gli utenti, anche quelli senza
terminale di controllo, con anche le informazioni sul nome utente e ora
inizio. In particolare, a seconda che l'argomento passato sia 'up' o 'down',
deve mostrare i processi in ordine ascendente o discendente di ora di inizio
del processo.
NOTA: controllare il valore dell'argomento
Io non lo so fare... vi prego aiutatemi!!!
Grazie,
CAMI.

 CAMI.
mmmmmmmm
beh quello che posso fare e' darti alcuni consigli del tipo:
-leggi la man page di ps [e pstree] e bash
-leggi un qualche manuale di programmazione bash del tipo
http://www.tldp.org/LDP/abs/html/
ciao ciao
e tra le altre cose anche a me ne avevano dato uno che sembrava
impossibile ma che si risolveva in una linea del tipo
http://tagliamento.sci.uniud.it/~deltoso/psview

  Io non lo so fare... vi prego aiutatemi!!!
Non e` difficile, servono giusto un po` di fondamenti:
- argomenti e parametri posizionali ($1, $2)
- test
- ps + sort
Per cui: cerca su 
www.tldp.org
 la "Advanced Bash Scripting Guide"
che a dispetto del nome non da` nulla per scontato ed e` pure
molto modulare, prova a buttar giu` qualcosa e se ti blocchi
o hai dei dubbi posta di nuovo qui.
-- 
Francesco Romani - Ikitt   (signature under [re]construction)
'A geek is someone who spends time being "social" on a computer.'
'In fact, users don't read /anything/' -- Joel Spolsky

 visto che a giugno dovrei dare un esame su unix/linux...
ehm, io l'esame di lab. di sistemi operativi l'ho preparato su questo libro:
The Unix Programming Environment
by Brian W. Kernighan and Rob Pike.
Prentice Hall, Inc., 1984.
ISBN 0-13-937681-X (paperback), 0-13-937699-2 (hardback).
l'ho trovato molto utile!
spero possa aiutarti.
ciao.
-- 
PierinoPD
gc...@despammed.com
linux user #353923
icq #219632374

 
http://tagliamento.sci.uniud.it/~deltoso/psview
se cerchi con google "bash one-liners" o simili,
trovi molte raccolte di programmi di "una riga" :-)
http://www.opentechsupport.net/forums/archive/topic/20438-1.html
www.wlug.org.nz/BashOneLiners
....
ciao, Andrea

./ps_monitor.sh [up|down]
Siccome sono proprio stronzo e non voglio che tu impari,non solo
ti posto una soluzione , ma ho anche piazzato qualche errore nonche'
omissis...
#!/bin/bash
OPT="--sort="
KEY="start_time"
case "$1" in
        up)
        OPT=$OPT"-"
        ;;
        down)
        ;;
        OPT=
        KEY=
        ;;
        *)
        echo "Usage 'basename "$0"' [up|down]"
        exit 1
        ;;
esac
ps aux ${OPT}${KEY}
N.B. lo devi sistemare senza usare ne' if ...then, ne' test e senza deus
ex machina.
E' altresi' possibile leggere il manuale.
 
-- 
Prima che tu trovi il tuo bel principe, ne devi baciare di rospi...
		-- Dalle Leggi di Murphy sul Sesso
mailto  `echo zbp.qrzzncfrq@vganf|rev|rot`

Ciao a tutti... ho fatto qualche progresso e sono riuscita a scrivere questo
script... non capirsco però perchè non mi giri (l'ho reso eseguibile con
chmod, ma mi da un errore!!!)... chi mi dice dove sta questo errore? 
#!/bin/bash
if [ -z "$1"] 
then
   echo "USAGE: ps_monitor.sh [up|down]"
   exit 1
fi
if [ $1 = "up"]
then
   ps auxw O+T
elif [ $1 = "down"]
then 
   ps auxw O-T
else
   echo "Error: argument should be 'up' or 'down'"
   exit 2
fi
Cosa cambiava se nella seconda riga scrivevo if [ -z $1]? Secondo me
niente...
Grazie,
CAMI.


 if [ -z "$1"]
              ^
  if [ -z "$1" ]
              ^
  Va *sempre* lasciato lo spazio tra le [ ... ]
  -z stringa      =     Vero se la lunghezza della stringa è zero
 


Non e' proprio un link, e' la sintassi corretta per richiamare il builtin 'test'
Quando la bash trova [ ... ] esegue 'test' con i parametri compresi tra
[ spazio ...  spazio ]
Oppure si puo eseguire direttamente ; test -z ...

 niente...
seconda riga 
if [ -z $1 ] oppure semplicemente
if [ ! $1 ]
[ come da man bash --> /test{SPACE}[invio] nnn ]
e analogamente per i test seguenti.
Cmq il programma non e' corretto , perche' , a norma di sintassi,
dovrebbe consentire la mancanza di argomenti.
Per quanto riguarda il problema della presenza delle virgolette
doppie , ti rispondo alla Bianchi:
Hint: man bash --> /virgolette. Troverai molte risposte premendo
"n" ogni tanto.
In genere servono a prevenire l'espansione della shell operata
su alcuni caratteri.
Ad es. $1 , $ciccio vengono tradotti nel loro contenuto, mentre "*" 
rimane immutato.
Prova a fare 
$ echo "*" 
$ echo *
$ echo "$PS1 *"
Le virgolette singole impediscono ogni espansione.
$ echo '$PS1 *'
Quindi dipende da qual'e' il valore associato a $1 .
Se scrivi ad es.:
$ pscript.sh "Car*to"
allo script verra' passato Car*to, anche se esiste il file Carletto.
Ma se tu scrivi ,dentro lo script, 
rm -f $1
Verra eliminato Carletto !
Etc.
 
Ho scritto questo post , ma con poca convinzione, perche' non
ha molto senso: queste cose s'imparano dai manuali e , soprattutto,
dagli esercizi.
Pero' un piccolo aiuto a chi inizia e' doveroso.
-- 
- Pierino, dove vivevano gli antichi Galli?
- Negli antichi pollai!
