Bourne Shell Ausgang wird nicht funktionieren
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
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