Newsgroup: it.comp.os.linux.iniziare
Titolo: Bash: verificare che un stringa sia presente in un'altra

Esiste un comando bash per controllare che una stringa sia presente
un'altra? Alternativa al comando?
 
Es. "L'apice e il pedice sono due stili di formattazione tipografica che
rispetto al testo normale prevedono una dimensione inferiore e un
posizionamento rispetto alla linea di base leggermente rialzato nel
primo caso, e abbassato nel secondo."
 
Sono presenti: abbassato, secondo, etc...
Non presenti: alzato, quarto, etc... 
 
Grazie anticipatamente.
 


Cercare con un motore di ricerca sarebbe la prima cosa da fare.
In rete di manuali bash se ne trovano a bizzeffe
 
 
Comunque ecco qualche esempio:
 
 
1)   [[ "my_str" =~ 'str' ]] && echo 1 #con le regexpr in bash
 
 
2) case "my_str" in #con il pattern matching in bash
	*str*)
		echo 1
		::
	*)
		echo 0
    esac
 
 
3)
 
echo my_str | grep str > /dev/null && echo 1 #con le regexpr in grep
 
 
 
4)
echo my_str | perl -ne '/str/ || exit 1' && echo 1 #con le regexpr in  perl
 
 
 
 
 

 ha scritto:

Ho fatto numerose ricerche e prove ma sbaglio qualcosa a cui non riesco a
venire a capo... :(
Metto il codice dell'esercizio che non riesco a completare sperando che
qualcuno mi dia una mano ;):
[CODE]
#!/bin/bash
###########################################################################
# Verifica che l'IP inserito sia correttamente associato al nome del sito #
###########################################################################
	#IP=5.153.231.140 #sbagliato
	IP=5.153.231.4 #giusto
	nomeDNS="
www.debian.org
"
	#l'IP e' valido?
	VERIFICA=$( dig +short @
8.8.4.4
 $nomeDNS )
		echo "*************************************************************"
		if [ "$VERIFICA" == "$IP" ]; then
			echo -e "\e[1;34m$IP + $DNS Ok\e[0;30m"
		else
			case "$IP" in #con il pattern matching in bash
				*$VERIFICA*)
					echo "Giusto!"
				;;
				*)
					echo -e "\e[1;31m$IP + $DNS non corretto\e[0;30m doveva essere $VERIFICA"
		    esac
			echo $IP | grep $VERIFICA > /dev/null && echo 1 #con le regexpr in grep
			echo $IP | perl -ne '/$VERIFICA/ || exit 1' && echo 1 #con le regexpr
in  perl
		fi
		echo "*************************************************************"
exit 0
[/CODE]
 

 ..
Altra prova:
[CODE]
#!/bin/bash
###########################################################################
# Verifica che l'IP inserito sia correttamente associato al nome del sito #
###########################################################################
	#IP=5.153.231.140 #sbagliato
	IP=5.153.231.4 #giusto
	nomeDNS="
www.debian.org
"
	#Quali sono/e' gli l'IP validi?
	VERIFICA=$( dig +short @
8.8.4.4
 $nomeDNS )
		echo "*************************************************************"
			Arraydiverifica=$( split( "$VERIFICA", arraymio, " " ) )
			# Assegno gli IP validi ad un'array
			ELEMENTS=${#Arraydiverifica[@]}
			echo "--------------------------------------"
			echo "Numero di elementi presenti: $ELEMENTS"
			echo "--------------------------------------"
    		N=0
		    for (( i=0; i<$ELEMENTS; i++ )); do
				if [ "${Arraydiverifica[${i}]}" = "$IP" ];then
				    N=$(($N + 1))
				fi
		    done
		echo "*************************************************************"
done
 
exit 0
[/CODE]
 
 


http://pastebin.com/EMqfHSEW
 
 
Ho provato anch'io ma mi restituisce questo errore :
 
 
sudo bash ip-corretto.sh
*************************************************************
ip-corretto.sh: command substitution: riga 12: errore di sintassi vicino 
al token non atteso ""$VERIFICA","
ip-corretto.sh: command substitution: riga 12: ` split( "$VERIFICA", 
arraymio, " " ) )'
--------------------------------------
Numero di elementi presenti: 0
--------------------------------------
*************************************************************
ip-corretto.sh: riga 24: errore di sintassi vicino al token non atteso 
"done"
ip-corretto.sh: riga 24: `done'
 
 


Perchè mettere l'output di dig in una variabile ?
Non serve:
 
 
dig +short @
8.8.4.4
 $nomeDNS  | while read; do echo $REPLY; done
 
 
dentro il corpo di while si puo elaborare l'ip
 
 
 
 
 

 dentro il corpo di while si puo elaborare l'ip
 
Thank you very much! :)
 

 ha scritto:
 
Perche' non mi cancella il valore di "$Giusto" all'uscita del while e non
valuta correttamente la condizione $Giusto > 0.... :( Grazie.
 
[CODE]
#!/bin/bash
###########################################################################
# Verifica che l'IP inserito sia correttamente associato al nome del sito #
###########################################################################
	#IP=5.153.231.140 #sbagliato
	IP=82.85.60.165 #giusto
	nomeDNS="
www.google.it
"
	Giusto=0
		echo "*************************************************************"
		dig +short @
8.8.4.4
 $nomeDNS  | while read; do 
			echo "*************************************************************"
			echo $REPLY
			echo "*************************************************************"
			case "$IP" in #con il pattern matching in bash
				*$REPLY*)
					Giusto=1
					echo "Valore di Giusto:$Giusto"
				;;
				*)
					echo -e "\e[1;31m$REPLY + $DNS non corretto\e[0;30m doveva essere $IP"
		    esac; done
		echo "*************************************************************"
		echo "Valore di Giusto:$Giusto"
		echo "*************************************************************"
		if [ $Giusto > 0 ]; then
			echo "*************************************************************"
			echo "L'ip indicato e' compreso tra quelli corretti"
			echo "*************************************************************"
		else
			echo "*************************************************************"
			echo -e "\e[1;31m L'ip indicato NON e compreso tra quelli corretti\e[0;30m"
			echo "*************************************************************"
		fi
exit 0
 
[/CODE]
 
 


Perche dentro la while si e' in un  sub process
Non puoi modificare una variabile esterna alla while
 

 Non puoi modificare una variabile esterna alla while
 
C'e' un modo per superare il problema?
 


... done | if grep 'Giusto:1' > /dev/null
then
	...
else
	...
fi
 

 
 
Ok, grazie! Questo mi serve per conoscenza personale:
Non c'e' un modo per settare una variabile da far leggere esternamente al ciclo?
Un trucco o un metodo alternativo? 
 

 al ciclo?
 
Scusa ma pur sforzandomi di comprendere non riesco proprio a capire il
senso della domanda e soprattutto che cosa alla fine vorresti ottenere.
 
Una cosa mi sembra chiara e cioe` che il subject di questo thread,
"Bash: verificare che una stringa sia presente in un'altra", non c'entra
nulla con quanto stai chiedendo ora in quanto sei passato a riproporre
un quesito che, facendo una pessima figura, hai, su diversi gruppi e
con nickname diversi, gia` postato nei giorni scorsi ricevendo risposte
adeguate.
 
Praticamente, se ho capito bene, devi verificare se un dato IP
corrisponda ad un determinato URL.
 
Epurando il codice scritto in precedenza da cornicette, stringhe
colorate e cavolate varie, mi sembra che la risposta tu ce l'abbia gia`
in tasca e cioe`:
 
#!/bin/bash
IP=91.189.93.8
#IP=5.153.231.140
URL="
www.ubuntu-it.org
"
dig +short @
8.8.4.4
 $URL | while read; do 
    case "$IP" in
	$REPLY)
	    echo "$IP + $URL -- corretto"
	    ;;
	*)
	    echo "$IP + $URL ---- NON corretto"
            echo "L'IP doveva essere $REPLY"
	    ;;
    esac
done
exit 0
 
Che altro vorresti oltre a cio`?
 
 
 
 
 

 Che altro vorresti oltre a cio`?
 
Dove?
Saluti.
 


Un processo puo modificare una variabile d' ambiente ma le modifiche non 
si riflettono sull' ambiente del processo padre.
Al massimo solo sui figli (la export della bash)
Posix funziona cosi.
Un modo è non usare una while ma un for (non viene creato un processo) 
sempre che la riga non contenga spazi.
 
f=0
for  i in $(<comando>)
do
    [ <cond> ] && { f=1;break; }
done
echo $f
 
 
lo svantaggio e' l'efficienza
La bash esegue comando e mette il suo output in memoria.
Se l' output fosse grosso la memoria usata puo essere molta e 
l'efficienza scarsa.
Inoltre esistono dei limiti sullo spazio occupato dalle variabili 
d'ambiente
 
 

 d'ambiente
 
Non ho avuto tempo di provare il for ma appena posso lo farò.
Grazie 1000! Ciao! :)