Frage

Ich habe das folgende Skript

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

alles funktioniert bis Echo und dann, wenn das Skript verlassen trifft es nicht und gehen hält. Irgendwelche Ideen.

Danke

War es hilfreich?

Lösung

Sie müssen nicht, dass Backslash -. Dies nicht der C-Shell ist

Das Problem ist, dass die while-Schleife in einer Unterschale ist, die beendet wird, sondern weil sie als Unterschale ausgeführt wird, setzt die Haupt-Skript.

Im Kontext ist die einfachste Lösung ist wahrscheinlich:

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

Wenn Sie mehrere Dateien verarbeiten müssen ( 'Katze "$ @"' anstelle von 'cat $ 1'), dann müssen Sie arbeiten a viel schwieriger etwas härter:

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

Diese prüfen den Exit-Status der Pipeline, bestehend aus ‚Katze‘ und ‚während‘, die der Exit-Status der ‚while‘ Schleife, die im Beispiel 1 sein wird, wenn ‚foo: bar‘ auf die gefunden wird Anfang einer Zeile.

Natürlich gibt es andere Möglichkeiten, das zu erkennen, wie zB:

grep -s -q "^foo:bar:" "$@" && exit 1

Dies führt viel weniger Befehle als die Schleifen Version. (Wenn Sie zu ermöglichen.: Auch '^ foo bar $', verwenden egrep anstelle von einfachen grep)

Andere Tipps

Sie übersetzen Ihren Text aus Kleinbuchstabe Text in Großbuchstaben Text, aber dann gegen niedrigeren Fall testen, so dass Sie nie zum Ausgang bekommen.

, da Sie für jede Zeile in Großbuchstaben umwandeln möchten, können Sie es wie folgt tun

#!/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

oder Sie können es tun, mit nur awk (nawk für Solaris)

nawk -F":" '
topper($1)=="FOO" && topper($2)=="BAR"{
    print "exist"
    exit
}
{
    print topper($0)
}
' file

Sie können Ihre conditionals Groß- und Kleinschreibung durch Zugabe von shopt -s nocasematch über den Test machen. So stellen Sie die Dinge wieder case-sensitive. shopt -u nocasematch

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top