Pagina 1 di 1

conditional statement

Inviato: mer 18 apr 2007, 11:04
da rdlkino
perdonate la rottura sembra una domanda a cui rispondere con rtfm...

i manuali li ho letti ma nn trovo la corretta spiegazione

qual è la giusta regola per creare una espressione condizionale data da più di una espressione negli script bash?

per intenderci il costrutto che mi serve è in java

if ((a > 5) && (b<=2))
then {....}

allora nel mio script bash sto usando:

if [ ($a -gt 5) -a ($b -le 2) ]
then
...
fi

perchè e sintatticcamente sbagliato?
qualcuno mi spiega le regole per mettere + di una conzione in and o in or?

Grazie

Re: conditional statement

Inviato: mer 18 apr 2007, 11:10
da masalapianta
rdlkino ha scritto:perdonate la rottura sembra una domanda a cui rispondere con rtfm...

i manuali li ho letti ma nn trovo la corretta spiegazione

qual è la giusta regola per creare una espressione condizionale data da più di una espressione negli script bash?

per intenderci il costrutto che mi serve è in java

if ((a > 5) && (b<=2))
then {....}

allora nel mio script bash sto usando:

if [ ($a -gt 5) -a ($b -le 2) ]
then
...
fi

perchè e sintatticcamente sbagliato?
qualcuno mi spiega le regole per mettere + di una conzione in and o in or?

Grazie
if [ $a -gt 5 ] && [ $b -le 2 ]; then
ecc...

Re: conditional statement

Inviato: mer 18 apr 2007, 12:16
da targzeta
masalapianta ha scritto:...
if [ $a -gt 5 ] && [ $b -le 2 ]; then
ecc...
o

Codice: Seleziona tutto

[ $a -gt 5 -a $b -le 2 ]
o

Codice: Seleziona tutto

[[ $a -gt 5 && $b -le 2 ]]
o, ancora, per renderla più vicino alla tua...

Codice: Seleziona tutto

[ \( $a -gt 5 \) -a \( $b -le 2 \) ]
Prendi l'abitudine di staccare i termini dalle parentesi e...dal man
( EXPRESSION )
EXPRESSION is true
quindi l'uso delle parentesi tonde per specificare la precedenza degli operatori è consentita ma....
Beware that parentheses need to be escaped (e.g., by backslashes) for shells.
Spina

P.S. noooo java nooooo

Inviato: mer 18 apr 2007, 18:10
da rdlkino
continuo sulla stessa scia...

piccolo problema:

conosco il nome di un file, link, directory ma in maniera case insensitive...

sia "piPpo" il nome di un file nel file system
potrebbe essere che il nome che io conosca sia "piPPO"

io devo poter accedere a questo file e in linux posso fare per esempio

cat [Pp][Ii][Pp][Pp][Oo]

e son sicuro di visualizzare il contenuto.

Bene.
mettiamo che io invece voglia verificare l'esistenza di tale file all'interno di uno script bash
ed abbia gli stessi problemi di misconoscenza del nome (non conoscenza del "case" delle lettere)

volevo utilizzare


if [ -e /dir1/dir2/dir3/[Pp][Ii][Pp][Pp][Oo] ]
then
....
fi

ma non funziona!
come posso fare?

Inviato: mer 18 apr 2007, 18:25
da danix
non puoi usare "grep -i" ??

mettiamo caso che la tua dir si trovi in /home/utente e si chiami directory

Codice: Seleziona tutto

home=/home/utente
dir=$(ls $home |grep -i directory)

cd $dir

Inviato: mer 18 apr 2007, 18:32
da Paoletta
puoi usare un workaround (tipo questo):

Codice: Seleziona tutto

var=`find  dir1/dir2/dir3 -iname "NOMEFILE"`
if [ $var ]
then
 ...
fi
per maggiori info: man find ;)

Inviato: mer 18 apr 2007, 18:39
da rdlkino
Rettifico alcune cose:

la cosa che ho scritto funziona da plurime prove

io scrivo

var1="/dir1/dir2/dir3/[Pp][Ii][Pp][Pp][Oo]"

if [ -e $var1 ]
then
...
fi

tuttavia non funziona se scrivo

var1="/dir1/dir2/dir3/[Pp][Ii][Pp][Pp][Oo]"

if [ -e "$var1" ]
then
...
fi

e non capisco perchè (primo problema)



Supponiamo ora che /dir1/dir2/dir3/[Pp][Ii][Pp][Pp][Oo] sia un link simbolico

var1="/dir1/dir2/dir3/[Pp][Ii][Pp][Pp][Oo]"

if [ -e $var1 ]
then
...
fi

il risultato dell'espressione condizionale nell ' if è FALSE:
il motivo è che $var1 viene così espanso (notato da un test con echo)

echo $var1

/dir1/dir2/dir3/nome_link path_a_cui_punta_il_link
^
qui c'è uno spazio bianco!

accade quindi che il test vede 2 argomenti e mi viene detto che il test si aspettava un operatore binario

Invece a
echo "$var1" corrisponde

/dir1/dir2/dir3/nome_link

tuttavia come detto prima se nel test metto le virgolette doppie questo non funziona come ci si attenderebbe...

come posso risolvere per eseguire correttamente il test in caso di link simbolico?

Grazie

Inviato: mer 18 apr 2007, 18:46
da Paoletta
rdlkino ha scritto: tuttavia non funziona se scrivo

var1="/dir1/dir2/dir3/[Pp][Ii][Pp][Pp][Oo]"

if [ -e "$var1" ]
then
...
fi

e non capisco perchè (primo problema)
non funziona perchè il comando test non digerisce le parentesi quadre in questione, che tu passi attraverso la variabile var; test è fatto per testare una condizione, find per trovare i files; i programmi di linux sono fatti per far bene una singola cosa, non per farne bene mille; se li sai combinare ottieni il risultato;

per trattare il caso del link simbolico basta che dai una leggiucchiata a man test

Inviato: gio 19 apr 2007, 7:30
da ZeD
Confermo: il "modo corretto" (o quantomeno il piu' facile) è usare find

falsoNome="pippo"
veroNome="$(find /dir1/dir2 -iname "$falsoNome" -maxdepth 1)"

e così eviti quell'accrocchio di [Pp][Ii][Pp][Pp][Oo], che è illeggibile :D

Inviato: ven 20 apr 2007, 16:34
da gamabunta

Codice: Seleziona tutto

var1="/dir1/dir2/dir3/[Pp][Ii][Pp][Pp][Oo]"
Nell'assegnamento i glob pattern non vengono espansi, indipendentemente dalle quotature, quindi a questo punto la variabile pippo conterra' la stringa /dir1/dir2/dir3/[Pp][Ii][Pp][Pp][Oo]

Codice: Seleziona tutto

if [ -e $var1 ]
then
...
fi
Qui prima la shell opera la sostituzione di variabile, poi espande i glob pattern, ma se quoti la variabile con i doppi apici l'espansione dei glob pattern non avviene e il comando test cerchera' il file /dir1/dir2/dir3/[Pp][Ii][Pp][Pp][Oo] letteralmente.
accade quindi che il test vede 2 argomenti e mi viene detto che il test si aspettava un operatore binario
L'espansione del glob pattern produce tanti argomenti quanti sono i file che soddisfano il pattern, per esempio:

Codice: Seleziona tutto

$ ls
PIPPO Pippo Pluto

$ echo [Pp][Ii][Pp][Pp][Oo]
PIPPO Pippo

[ -e [Pp][Ii][Pp][Pp][Oo] ]
[: PIPPO: binary operator expected

[ -e "[Pp][Ii][Pp][Pp][Oo]" ]
#non espande i glob pattern
#vero solo se esiste il file [Pp][Ii][Pp][Pp][Oo] letteralmente
Anch'io voto per il find ;) ricordati l'opzione -maxdepth cosi' eviti un'inutile visita ricorsiva di tutto il sottoalbero, oppure anche qualcosa come:

Codice: Seleziona tutto

if ls | grep -e pippo -iqx; then
 ...
fi