Newsgroup: it.comp.os.linux.iniziare
Titolo: bash: booleani multipli in condizionale if

Salve,
mi servirebbe indagare gli argomenti passati al mio script in questo
modo.
Il primo e' sempre un path, e adesso non ci preoccupa.
Il secondo e il terzo possono o una stringa e un numero, o un numero e
una stringa.
Per esempio l'esecuzione potrebbe essere
./script path 10 stringa
oppure
./script path stringa 10
ogni argomento viene assegnato a una variabile.
Se uno degli argomenti manca, la variabile assume un valore di
default.
Il mio problema e' che i valori assegnati alle variabili sono sempre
quelli di default, come se il mio if fallisse sempre.
Posto le righe dello script incriminate.
Magari e' un problema di precedenza o costrutto, non saprei proprio.
Qualcuno sa darmi una dritta?
Ah, naturalmente consigli su un metodo piu' efficace o elegante sono
bene accetti.
grazie in anticipo,
mirko
------ script qui ----------
#!/bin/bash
DEFAULT_NUM_PHOTOS=100
DEFAULT_KEYWORD="Default"
echo Arg2 is $2
echo Arg3 is $3
## checking for NUMBER_PHOTOS argument
if [ "$#" -gt "1" -a "$2" = [[:digit:]] -o "$3" = [[:digit:]] ]
	then
		[ "$2" = [[:digit:]] ] && ( NUMBER_PHOTOS="$2" ) ||
( NUMBER_PHOTOS="$3" )
	else
		NUMBER_PHOTOS=$DEFAULT_NUM_PHOTOS
fi
## checking for KEYWORD argument
if [ "$#" -gt "1" -a "$2" = [[:alpha:]] -o "$3" = [[:alpha:]] ]
	then
		[ "$2" = [[:alpha:]] ] && ( KEYWORD="$2" ) || ( KEYWORD="$3" )
	else
		KEYWORD=$DEFAULT_KEYWORD
fi
echo $NUMBER_PHOTOS
echo $KEYWORD

 if [ "$#" -gt "1" -a "$2" => [[:digit:]] -o "$3" = [[:digit:]] ]
sei sicuro che [[:digit:]] possa essere utilizzato dentro ad un test? 
Probabilmente viene trattata come una qualsiasi stringa:
$ [ "[[:digit:]]" = [[:digit:]] ] && echo ciao
ciao
infatti :)
Per controllare che una variabile contenga un numero puoi usare grep:
echo $var | grep -q "^[0-9][0-9]*$"
Per renderlo più comodo potresti inserirlo in una funzione. Qua lo hanno 
fatto: 
http://justlinux.com/forum/showthread.php?t=107246
-- 
no signature yet

 ciao
credo che [[:digit:]] si possa usare in un test, infatti:
$ [[ "2" = [[:digit:]] ]] && echo is digit || is not digit
is digit
$ [ "2" = [[:digit:]] ] && echo is digit || is not digit
is not digit
un problema di quadre. Tuttavia usando le doppie quadre bash mi da'
problemi coi booleani, nel senso che si lamenta cosi:
$ [[ "2" = [[:digit:]] -o "3" = [[:digit:]] ]] && echo at least one is
digit || none is digit
bash: syntax error near '-o'
$ [ "2" = [[:digit:]] -o "3" = [[:digit:]] ] && echo at least one is
digit || none is digit
none is digit
Nell'ultimo caso e' come dici tu, [[:digit:]] viene trattato come una
stringa e il test fallisce. Ma allora come si combinano le cose? mi
sto mancando qualcosa di importatante...

 bash: syntax error near '-o'
stando a `help \[\[` pare che con le doppie quadre tu debba utilizzare && 
e ||. Quindi
$ [[ "2" = [[:digit:]] || "3" = [[:digit:]] ]] && echo at least one is 
digit || echo none is digit
occhio che in questo caso && ha precedenza su ||:
 [ 1 = 0 -a 1 = 0 -o 1 = 1 ]   ~  falso AND (falso OR vero) = falso
[[ 1 = 0 && 1 = 0 || 1 = 1 ]]  ~ (falso AND falso) OR vero = vero
dove ~ l'ho usato come operatore "è equivalente a"
Te lo dico perché la riga nel tuo primo post:
[ "$#" -gt "1" -a "$2" = [[:digit:]] -o "$3" = [[:digit:]] ]
non andrà convertita in
[[ "$#" -gt "1" && "$2" = [[:digit:]] || "$3" = [[:digit:]] ]]
ma in
[[ "$#" -gt "1" && ( "$2" = [[:digit:]] || "$3" = [[:digit:]] ) ]]
-- 
no signature yet

 e ||. Quindi
grazie! super mitico!
i forum andrebbero consacrati con l'acqua santa.