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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top