Repository 32bit  Forum
Repository 64bit  Wiki

Problema assurdo con uno script.

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Problema assurdo con uno script.

Messaggioda ragnetto » ven apr 25, 2008 14:52

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.
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Re: Problema assurdo con uno script.

Messaggioda gioco » ven apr 25, 2008 16:40

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.
Avatar utente
gioco
Packager
Packager
 
Messaggi: 900
Iscritto il: sab giu 18, 2005 23:00
Località: in the court of the Wesnoth king
Slackware: last stable

Re: Problema assurdo con uno script.

Messaggioda 414N » ven apr 25, 2008 19:19

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 (").
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Problema assurdo con uno script.

Messaggioda ragnetto » ven apr 25, 2008 20:32

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.
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Re: Problema assurdo con uno script.

Messaggioda Mario Vanoni » ven apr 25, 2008 20:53

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Problema assurdo con uno script.

Messaggioda Mario Vanoni » ven apr 25, 2008 21:23

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Problema assurdo con uno script.

Messaggioda 414N » ven apr 25, 2008 21:27

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...
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Problema assurdo con uno script.

Messaggioda Mario Vanoni » ven apr 25, 2008 21:44

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Problema assurdo con uno script.

Messaggioda 414N » ven apr 25, 2008 21:52

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.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Problema assurdo con uno script.

Messaggioda Mario Vanoni » sab apr 26, 2008 8:06

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Problema assurdo con uno script.

Messaggioda 414N » sab apr 26, 2008 8:44

Ho capito. Grazie per il chiarimento :notworthy:
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Problema assurdo con uno script.

Messaggioda ragnetto » sab apr 26, 2008 9:00

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
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Re: Problema assurdo con uno script.

Messaggioda 414N » sab apr 26, 2008 9:40

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.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Problema assurdo con uno script.

Messaggioda Mario Vanoni » sab apr 26, 2008 9:46

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: Problema assurdo con uno script.

Messaggioda ragnetto » sab apr 26, 2008 10:26

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.
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite