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
o
o, ancora, per renderla più vicino alla tua...
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

Inviato: ven 20 apr 2007, 16:34
da gamabunta
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]
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: