Newsgroup: it.comp.os.linux.iniziare
Titolo: Test di un pattern all'interno di una stringa

Perché il test dei comandi mi dà esito negativo anche quando il pattern è
contenuto nella variabile VAR?
Vedi passaggi numero 6), 7), 10), 11).
1)  VAR='AAA BBB CCC'
2)  [[ "$VAR" =~ "B" ]]; echo $?
    0
3)  [[ "$VAR" =~ "D" ]]; echo $?
    1
4)  expr match "$VAR" ".*B" > /dev/null ; echo $?
    0
5)  expr match "$VAR" ".*D" > /dev/null ; echo $?
    1
6)  [[ `expr match "$VAR" ".*B" > /dev/null` ]] ; echo $?
    1
7)  [[ `expr match "$VAR" ".*D" > /dev/null` ]] ; echo $?
    1
8)  echo "$VAR" | grep -q B ; echo $?
    0
9)  echo "$VAR" | grep -q D ; echo $?
    1
10) [[ `echo "$VAR" | grep -q B` ]] ; echo $?
    1
11) [[ `echo "$VAR" | grep -q D` ]] ; echo $?
    1

 ...
expr match "$VAR" ".*B" > /dev/null
redirigi l'output nel buco nero, non produci output, 
ottieni una stringa vuota.
`expr match "$VAR" ".*B" > /dev/null`
applica la sostituzione dei comandi ad una stringa vuota ed 
ottiene una stringa vuota.
[[ `expr match "$VAR" ".*B" > /dev/null` ]]
cerca di valutare una stringa vuota come espressione 
condizionale, non riesce, la valuta come una condizione 
falsa, il suo stato è "1".
man bash
man expr
PS expr è ampiamente obsoleto, la bash valuta espressioni 
aritmetiche e logiche con [[ ]] e (( )).

(continua da precedente messaggio)
echo $VAR
    AAA BBB CCC
Se da grep tolgo -q pare che funzioni:
[[ `echo "$VAR" | grep "B"` ]]; echo $?
    0
[[ `echo "$VAR" | grep "D"` ]]; echo $?
    1
Mentre con expr match non funziona anche togliendo " > /dev/null ":
[[ `expr match "$VAR" ".*B"` ]] ; echo $?
    0
[[ `expr match "$VAR" ".*D"` ]] ; echo $?
    0
(dà sempre esito positivo (exit code: 0) anche quando non dovrebbe)
Perché il test del pipe verso grep funziona (pare) togliendo -q ?
Perché il test di expr match non funziona mai ?



 falsa, il suo stato è "1"
Ok, questo mi è chiaro e più o meno ci ero arrivato anch'io (poco dopo aver
postato).
==> Però spiegami, per favore, allora perché _togliendo_la_redirezione
_dell'output_a_/dev/null_ l'exit status è sempre 0 (aspetta: in calce tento
anch'io una risposta):
VAR='AAA BBB CCC'
expr match "$VAR" ".*B" ; echo $?
    7
    0
expr match "$VAR" ".*D" ; echo $?
    0
    1
# e fin qui tutto OK, ma sottoponendo a test il comando, ottengo...
[[ `expr match "$VAR" ".*B"` ]]; echo $?
    0
[[ `expr match "$VAR" ".*D"` ]]; echo $?
    0
(cioè l'exit status è 0 anche quando --apparentemente-- non dovrebbe, dato
che D non è presente nella stringa memorizzata nella variabile)
Il discorso per -q in grep è analogo a quello per la redirezione
a /dev/null, vero?
Cioè: se tolgo -q , test «cerca di valutare una stringa vuota come
espressione  condizionale, non riesce, la valuta come una condizione falsa,
il suo stato è "1"».
In altre parole siccome, come leggo da man test,
    ...
    An omitted EXPRESSION defaults to false
    ...
Dunque "> /dev/null" e "-q" fanno sì che l'espressione da valutare diventi
vuota.
Giusto?
Mi resta l'interrogativo di cui sopra, relativo al test di expr match...
risponderei così:
In entrambi i casi
[[ `expr match "$VAR" ".*B"` ]]; echo $?
e
[[ `expr match "$VAR" ".*D"` ]]; echo $?
l'espressione valutata da test diventa vera, perché expr match restituisce
comunque un valore posizionale (0, nel secondo caso) e quindi l'exit code
_di_test_ diventa sempre 0 (a differenza dell'exit code del comando expr
match che, ovviamente, nei due casi cambia)
==> Dimmi, per favore, che ne pensi

 ...
Non leggere i manuali è un errore grave.
Piú grave è leggere il manuale sbagliato.
L'operatore "[[ ]]" costruisce un comando composto che
valuta una espressione condizionale.
Il comando "test" (che si abbrevia con "[" ) valuta una 
espressione condizionale.
Chiara la differenza? 
Hai notato "[" una parentesi e "[[" due parentesi?

 vuota.


 vuota.


 Hai notato "[" una parentesi e "[[" due parentesi?
Ma certo che l'ho notato. E' che non capisco come dalle due definizioni che
hai dato emerga una differenza.
Se puoi (e se ti va), leggi, per favore, il messaggio seguente e valuta
quanto ho scritto (nel caso, vedi anche se sai darmi una spiegazione per il
punto in cui ho scritto "***e sarei curioso di sapere perché***").
Grazie in ogni modo.