Pagina 1 di 2

Problema assurdo con uno script.

Inviato: ven 25 apr 2008, 15:52
da ragnetto

Codice: Seleziona tutto

#!/bin/bash
ping=`/bin/ping -c 1 www.google.it`
scon="ping: unknown host www.google.it"
if [ '${ping}' = '${scon}' ]
then
   echo "sconnesso"
else
   echo "connesso"
fi
Questo è quello che succede all' atto pratico:

Codice: Seleziona tutto

bash-3.1# /etc/rc.d/rc.inet1 stop 
/etc/rc.d/rc.inet1:  /sbin/route del default
/etc/rc.d/rc.inet1:  /sbin/ifconfig eth0 down
/etc/rc.d/rc.inet1:  /sbin/ifconfig lo down
bash-3.1# ./al
ping: unknown host www.google.it
connesso
bash-3.1# /etc/rc.d/rc.inet1 start
/etc/rc.d/rc.inet1:  /sbin/ifconfig lo 127.0.0.1
/etc/rc.d/rc.inet1:  /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo
/etc/rc.d/rc.inet1:  /sbin/ifconfig eth0 192.168.0.5 broadcast 192.168.0.255 netmask 255.255.255.0
/etc/rc.d/rc.inet1:  /sbin/route add default gw 192.168.0.1 metric 1
bash-3.1# ./al
connesso
bash-3.1# 
,

mi sapreste dire cosa c' è che non và?
Grazie.

Re: Problema assurdo con uno script.

Inviato: ven 25 apr 2008, 17:40
da gioco
Io farei così

Codice: Seleziona tutto

#!/bin/bash
/bin/ping -c 1 www.google.it
if [ $? = 0 ]; then
   echo "connesso"
else
   echo "sconnesso"
fi
Il tuo non funziona perchè in ping viene salvato solo lo standard out, mentre il messaggio di unknown host viene scritto su standard err, e quindi in quel caso ping è una stringa vuota.

Re: Problema assurdo con uno script.

Inviato: ven 25 apr 2008, 20:19
da 414N
ragnetto ha scritto:

Codice: Seleziona tutto

if [ '${ping}' = '${scon}' ]
Oltre a quello, anche l'uso degli apici singoli ('): se metti una variabile tra apici singoli questa non verrà espansa, percui verrà fatto il confronto tra le stringhe ${ping} e ${scon}, che ovviamente non si somigliano neanche per sbaglio, ergo vai sempre a finire nel ramo else dell'if.
Se proprio devi usare questa soluzione, sostituiscili con apici doppi (").

Re: Problema assurdo con uno script.

Inviato: ven 25 apr 2008, 21:32
da ragnetto
Funzia tutto ma non riesco a capire... L' uguale non si scrive "=="? Quello "0" che rappresenta di preciso? 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...),

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.

Re: Problema assurdo con uno script.

Inviato: ven 25 apr 2008, 21:53
da Mario Vanoni
ragnetto ha scritto:Funzia tutto ma non riesco a capire... L' uguale non si scrive "=="? Quello "0" che rappresenta di preciso? 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...),

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.
Risposta alla prima domanda:
nella Bourne Shell = significa uguale,
la Bash accetta anche == come uguale,
ma non portabile su ksh, zsh ecc.

Mario Vanoni

Re: Problema assurdo con uno script.

Inviato: ven 25 apr 2008, 22:23
da Mario Vanoni
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
$? e` il valore di ritorno dell'ultimo comando, /sbin/clock!

Fai /sbin/clock, che output ti da?
Poi echo $?

Mario Vanoni

Re: Problema assurdo con uno script.

Inviato: ven 25 apr 2008, 22:27
da 414N
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:

Codice: Seleziona tutto

STRING1 = STRING2
              the strings are equal
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

Codice: Seleziona tutto

MIA_VAR=`/sbin/clock`
echo "$MIA_VAR"
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:

Codice: Seleziona tutto

date
ven apr 25 22:24:09 CEST 2008
Se invece usi gli "specificatori" di formato %H (ore nel formato 00...23) e %M (minuti 00..59) così:

Codice: Seleziona tutto

date +%H:%M
22:25
ottieni l'ora senza altri fronzoli da filtrare.
Poi vedi tu.
Tra l'altro mi devi poi spiegare perchè non puoi usare crontab...

Re: Problema assurdo con uno script.

Inviato: ven 25 apr 2008, 22:44
da Mario Vanoni
414N ha scritto:leggerti il man test.
Infatti nella suddetta man page compare:

Codice: Seleziona tutto

STRING1 = STRING2
              the strings are equal
percui l'operatore per controllare se due stringhe sono uguali è proprio = (singolo).
SBAGLIATO

man bash
test e` uno shell built-in
standard e` ==
= e` accettato "for strict POSIX compliance"

Mario Vanoni

Re: Problema assurdo con uno script.

Inviato: ven 25 apr 2008, 22:52
da 414N
Mario Vanoni ha scritto: SBAGLIATO

man bash
test e` uno shell built-in
standard e` ==
= e` accettato "for strict POSIX compliance"

Mario Vanoni
Sai, prima di postare quanto sopra mi era venuto il dubbio se test fosse una built-in o meno.
Ero convinto fosse una built-in, ma poi ho trovato un test in /usr/bin e una pagina di man solo per lui... Al che mi è venuto il dubbio.
Andando però a controllare nel man di bash come suggerisci:

Codice: Seleziona tutto

CONDITIONAL EXPRESSIONS
       Conditional  expressions  are  used  by the [[ compound command and the
       test and [ builtin commands to test file attributes and perform  string
       and  arithmetic comparisons.
e qui afferma che test e [ sono builtin.
A questo punto sono un po' confuso pure io.

Re: Problema assurdo con uno script.

Inviato: sab 26 apr 2008, 9:06
da Mario Vanoni
414N ha scritto:
Mario Vanoni ha scritto: SBAGLIATO

man bash
test e` uno shell built-in
standard e` ==
= e` accettato "for strict POSIX compliance"

Mario Vanoni
Sai, prima di postare quanto sopra mi era venuto il dubbio se test fosse una built-in o meno.
Ero convinto fosse una built-in, ma poi ho trovato un test in /usr/bin e una pagina di man solo per lui... Al che mi è venuto il dubbio.
Andando però a controllare nel man di bash come suggerisci:

Codice: Seleziona tutto

CONDITIONAL EXPRESSIONS
       Conditional  expressions  are  used  by the [[ compound command and the
       test and [ builtin commands to test file attributes and perform  string
       and  arithmetic comparisons.
e qui afferma che test e [ sono builtin.
A questo punto sono un po' confuso pure io.
Nella bash fai
help
help test

chiamando test dalla shell avrai sempre il buit-in
/bin/test devi chiamarlo esplicitamente
/usr/bin/test e` un link simbolico a /bin/test

Mario Vanoni

Re: Problema assurdo con uno script.

Inviato: sab 26 apr 2008, 9:44
da 414N
Ho capito. Grazie per il chiarimento :notworthy:

Re: Problema assurdo con uno script.

Inviato: sab 26 apr 2008, 10:00
da ragnetto
Non funzia,

Codice: Seleziona tutto

#!/bin/bash
ora='/bin/date +%H:%M'
if [ "${ora}" == "12:30" ]
then
   echo "non è ora"
else
   echo "è ora"
   echo "${ora}"
fi
ma siamo sicuri che quelle virgolettte e apici siamo giusti? Questo è l' output:

Codice: Seleziona tutto

bash-3.1# ./co 
è ora
/bin/date +%H:%M

Re: Problema assurdo con uno script.

Inviato: sab 26 apr 2008, 10:40
da 414N
Ti avevo detto di usare i `` non i ''.
Prova con:

Codice: Seleziona tutto

#!/bin/bash
ORA=`date +%H:%M`
if [ "$ORA" = "12:30" ]
then
  echo "non è ora."
else
  echo "è ora."
fi
echo "$ORA"
Ovviamente in questo modo date deve essere nel path per funzionare.

Re: Problema assurdo con uno script.

Inviato: sab 26 apr 2008, 10:46
da Mario Vanoni
ragnetto ha scritto:Non funzia,

Codice: Seleziona tutto

#!/bin/bash
ora='/bin/date +%H:%M'
if [ "${ora}" == "12:30" ]
then
   echo "non è ora"
else
   echo "è ora"
   echo "${ora}"
fi
ma siamo sicuri che quelle virgolettte e apici siamo giusti? Questo è l' output:

Codice: Seleziona tutto

bash-3.1# ./co 
è ora
/bin/date +%H:%M
ora=`/bin/date +%H:%M`

accento grave, oppure solo nella bash

ora=$(/bin/date +%H:%M)

Mario Vanoni

Re: Problema assurdo con uno script.

Inviato: sab 26 apr 2008, 11:26
da ragnetto

Codice: Seleziona tutto

#!/bin/bash
ORA=`/bin/date +%H:%M`
if [ "$ORA" [b]![/b]= "11:25" ]
then
  echo "non è ora."
else
  echo "è ora."
fi
echo "$ORA"
adesso funzia, grazie a tutti.