Ciao e benvenuto anche da parte mia.
Sottoscrivo quanto già affermato da spina e aggiungo che, messo giù così, il codice non potrà mai funzionare: non hai considerato che, ogni volta che metti in pipe (|) dei comandi, questi vengono eseguiti in sottoprocessi indipendenti dal processo genitore che li ha lanciati.
Nel tuo codice, il processo genitore (chiamiamolo p0) inizializza la variable check a 0 (nel suo ambiente), poi viene creato un nuovo processo con una
copia dell'ambiente (p1) che esegue il cat (superfluo come già detto da spina), dopodiché ne viene creato un altro (p2) che esegue grep, un'altro (p3) che esegue awk e un'altro (p4) che esegue il while. Tutti i processi p1-4 possiedono una copia della variabile check, ma non "puntano" più alla variabile check di p0. Quindi, quando in p4 poni check a 1 lo fai solo per la copia di check presente nell'ambiente di p4. È per questo che, una volta uscito dai sottoprocessi al termine del ciclo e tornato in p0, check è ancora a 0.
Per ottenere quello che vuoi fare, puoi agire in maniera diversa:
Codice: Seleziona tutto
#!/bin/sh
# Pongo lo standard output del comando racchiuso tra `` (si ottengono tramite ALTGR+') nella variabile CHECK. In questo caso il comando è costituito da una lista di comandi interconnessi tramite pipe.
CHECK=`grep -v nanos nodelist | awk -F ';' '{print $1}' | while read NODO
do
if [ "$NODO" = "torpedo" ];then
# Stampo qualcosa su standard output. Cosa non ha importanza in questo contesto, tanto in seguito si controlla solo se CHECK è stata impostata a qualcosa o no
echo OKCQMWCNQCIUQNCQC
fi
done`
# Controllo se CHECK è impostata, il che significa che la echo all'interno del while è stata raggiunta.
if [ $CHECK ]
then
echo "torpedo trovato"
else
echo "torpedo non trovato"
fi
Per approfondire l'argomento dei sottoprocessi avviati dalla shell, puoi dare un'occhiata a
questa pagina.
PS: l'usanza comune è di usare nomi di variabili tutti in maiuscolo in ambito di bash scripting, per farli risaltare rispetto ai comandi o alle builtin della shell.