conditional statement

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
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.
Rispondi
rdlkino
Linux 0.x
Linux 0.x
Messaggi: 63
Iscritto il: sab 25 mar 2006, 14:47

conditional statement

Messaggio 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

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: conditional statement

Messaggio 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...

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: conditional statement

Messaggio 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

rdlkino
Linux 0.x
Linux 0.x
Messaggi: 63
Iscritto il: sab 25 mar 2006, 14:47

Messaggio 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?

Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

Messaggio 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
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio 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 ;)

rdlkino
Linux 0.x
Linux 0.x
Messaggi: 63
Iscritto il: sab 25 mar 2006, 14:47

Messaggio 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

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio 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

Avatar utente
ZeD
Linux 1.x
Linux 1.x
Messaggi: 112
Iscritto il: ven 28 ott 2005, 12:30
Slackware: 12.1
Località: Terra

Messaggio 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

Avatar utente
gamabunta
Linux 0.x
Linux 0.x
Messaggi: 9
Iscritto il: lun 24 ott 2005, 0:33

Messaggio 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

Rispondi