Vous n'avez pas besoin que la barre oblique inverse - ce n'est pas le shell C.
Le problème est que la boucle while est dans une sous-shell, qui se ferme, mais comme elle est exécutée en tant que sous-shell, le script principal continue.
Dans le contexte, la solution la plus simple est probablement:
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
Si vous devez traiter plusieurs fichiers (« chat « $ @ pour » » au lieu de « cat $ 1 »), alors vous devez travailler beaucoup plus difficile plus difficile:
cat "[email protected]" |
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
Cela affiche l'état de sortie du pipeline composé de « chat » et « tout », qui est l'état de sortie de la boucle « while », qui sera 1 dans la exemple si 'foo: bar' est trouvé au début d'une ligne.
Bien sûr, il existe d'autres moyens pour détecter que, par exemple:
grep -s -q "^foo:bar:" "[email protected]" && exit 1
Cette exécute beaucoup moins de commandes que la version en boucle. (Si vous devez également utiliser '^ foo: bar $', utilisez egrep au lieu de grep simple.)
UUOC: au lieu de chat 1 $ | while ... vous pouvez le faire while ... done <$ 1 –
-1 pour UUOC et en utilisant des commandes externes pour chaque ligne. – ghostdog74