Uhm, mi sa che hai fatto un bel po' di caos.
Dunque, per cominciare:
ragnetto ha scritto:Funzia tutto ma non riesco a capire... L' uguale non si scrive "=="?
Innanzitutto sappi che l'uso delle parentesi quadre negli if è un'abbreviazione di test, un comando. Percui per ulteriori informazioni puoi leggerti il man test.
Infatti nella suddetta man page compare:
percui l'operatore per controllare se due stringhe sono uguali è proprio = (singolo).
ragnetto ha scritto:
Quello "0" che rappresenta di preciso?
0 è 0... Forse non sai cosa significa $?: è il valore ritornato dal programma appena lanciato. Normalmente, quando un programma termina senza errori ritorna 0, altrimenti un'altro numero.
Percui il controllo fatto è se l'esecuzione del comando ping è andata a buon fine senza errori.
ragnetto ha scritto:
L' output del comando ping è una stringa, giusto? Come fà ad essere confrontata con una quantità (o con un booleano) e funzionare? Per esempio, ho lo stesso prob con un' altro script, deve eseguire un comando ad una data ora (non posso usare crontab...),
Come già detto sopra, questo if non controlla l'output di ping (nel senso di ciò che viene scritto su standar output), piuttosto il valore ritornato dal programma.
Per quanto riguarda il discorso stringhe, booleani, quantità etc. non c'è problema: secondo bash è tutto una stringa a meno che non si usino comandi specifici per attribuire ad una stringa un significato numerico per poterci fare dei conti sopra (vedi l'uso delle parentesi tonde e di eval in man bash).
ragnetto ha scritto:
Codice: Seleziona tutto
#!/bin/bash
/sbin/clock
if [ $? == "*12:30*" ]
then
echo "non è ora"
else
echo "è ora"
comando da eseguire
fi
.
L' output di clock
Codice: Seleziona tutto
Fri 25 Apr 2008 [b]09:26:[/b]32 PM AKDT -0.554595 seconds
viene confrontato con una stringa che contiene quei 6 caratteri che mi interessasno e il resto può essere qualsiasi cosa.
Dalla spiegazione qui sopra avrai capito che $? non pesca l'output del programma su stdout, percui il controllo che fai nell'if è sbagliato. Ti consiglierei piuttosto l'uso delle ` ` (sono apici che ottieni premendo ALT GR + ' ), i quali non fanno altro che mettere all'interno di una stringa l'output di un programma.
Se quindi per esempio fai
otterrai in output l'output di /sbin/clock (ovviamente con l'orario di quando è stato lanciato, non di quando l'hai stampato con la echo).
Altra cosa, gli asterischi prima e dopo 12:30 non significano "0 o più caratteri" prima e dopo 12:30. La shell espande gli asterischi con il contenuto dell'attuale directory, quindi con l'elenco di tutti i files/directory che contiene. Per filtrare una stringa con pattern quali * e altri, guarda come funziona grep (è uno strumento molto potente ma anche un po' ostico per chi non l'ha mai usato).
Premesso tutto questo (anf, pant), perchè non usi il comando date? Ti permette di modifcare l'output nella forma che vuoi te.
Per esempio, se lo lanci normalmente ti restituisce:
Se invece usi gli "specificatori" di formato %H (ore nel formato 00...23) e %M (minuti 00..59) così:
ottieni l'ora senza altri fronzoli da filtrare.
Poi vedi tu.
Tra l'altro mi devi poi spiegare perchè non puoi usare crontab...