sortie Bourne Shell ne fonctionnera pas
Question
Je le script suivant
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
tout fonctionne jusqu'à écho, puis lorsque le script frappe sortie, il ne fonctionne pas et continue à aller. Toutes les idées.
Merci
La solution
Vous n'avez pas besoin que backslash -. Ce n'est pas le shell C
Le problème est que la boucle while est dans un sous-shell, qui sort, mais parce qu'il est géré comme un sous-shell, le script principal se poursuit.
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 "$ @"' au lieu de 'cat $ 1'), alors vous devez travailler beaucoup plus difficile peu plus 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
vérifie l'état de sortie de la canalisation constituée de « chat » et « tout », qui est l'état de sortie de la boucle while, qui sera 1 dans l'exemple si « foo: bar » se trouve à la début d'une ligne.
Bien sûr, il existe d'autres moyens pour détecter que, par exemple:
grep -s -q "^foo:bar:" "$@" && exit 1
Il exécute beaucoup moins de commandes que la version en boucle. (Si vous devez permettre. '^ Foo: bar $', ainsi, utiliser egrep au lieu de grep ordinaire)
Autres conseils
Vous traduisez votre texte à partir du texte minuscule au texte en majuscules, mais les tests puis contre les minuscules, donc vous jamais à la sortie.
puisque vous voulez convertir en majuscules pour chaque ligne, vous pouvez le faire comme ceci
#!/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
OU vous pouvez le faire avec juste awk (nawk pour Solaris)
nawk -F":" '
topper($1)=="FOO" && topper($2)=="BAR"{
print "exist"
exit
}
{
print topper($0)
}
' file
Vous pouvez faire votre conditionals insensible à la casse en ajoutant shopt -s nocasematch
au-dessus du test. Pour régler les choses au sensible à la casse. shopt -u nocasematch