uscita Bourne Shell non funziona
Domanda
Ho il seguente script
cat $1 | while read line
do
line=`echo $line | tr "[:lower:]" "[:upper:]"`
if [ "`echo $line | cut -f1 -d:`" = "foo" ] && \
[ "`echo $line | cut -f2 -d:`" = "bar" ]; then
echo 'exsist'
exit 1;
fi
done
tutto funziona fino a risuonare e poi quando lo script colpisce uscire non e che continua ad andare. Tutte le idee.
Grazie
Soluzione
Non è necessario che il backslash -. Questa non è la shell C
Il problema è che il ciclo while è in una sotto-shell, che esce, ma perché è gestito come un sub-shell, script principale continua.
Nel contesto, la soluzione più semplice è probabilmente:
while read line
do
line=`echo $line | tr "[:lower:]" "[:upper:]"`
if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
[ "`echo $line | cut -f2 -d:`" = "bar" ]; then
echo 'exist'
exit 1
fi
done < $1
Se si deve elaborare più file ( 'cat "$ @"' invece di 'cat $ 1'), poi si deve lavorare un molto più difficile po 'più difficile:
cat "$@" |
while read line
do
line=`echo $line | tr "[:lower:]" "[:upper:]"`
if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
[ "`echo $line | cut -f2 -d:`" = "bar" ]; then
echo 'exist'
exit 1
fi
done
[ $? != 0 ] && exit 1
Questa verifica lo stato di uscita del gasdotto costituito da 'gatto' e 'mentre', che è lo stato di uscita del ciclo 'while, che sarà 1 nell'esempio se 'foo: bar' si trova al all'inizio di una riga.
Naturalmente, ci sono altri modi per rilevare che, come ad esempio:
grep -s -q "^foo:bar:" "$@" && exit 1
Questa esegue molto meno comandi rispetto alla versione loop. (Se è necessario per consentire. '^ Foo: bar $' così, utilizzare egrep invece di grep pianura)
Altri suggerimenti
Si sta traducendo il testo da caso testo in basso in testo maiuscolo, ma poi prova contro il minuscolo, in modo da non arrivare all'uscita.
dal momento che si desidera convertire in maiuscolo per ogni linea, si può fare in questo modo
#!/bin/sh
tr '[:lower:]' '[:upper:]' < file | while IFS=":" read -r a b c
do
case "$a $b" in
"FOO BAR" ) echo "exist";exit;;
*) echo "$a $b";;
esac
done
O lo si può fare solo con awk (nawk per Solaris)
nawk -F":" '
topper($1)=="FOO" && topper($2)=="BAR"{
print "exist"
exit
}
{
print topper($0)
}
' file
È possibile rendere i condizionali case-insensitive aggiungendo shopt -s nocasematch
sopra il test. Per impostare le cose a maiuscole e minuscole. shopt -u nocasematch