Archiv verlassen und diese Seite im Standarddesign anzeigen : if [ `diff datei1 datei2` ]; funzt nicht
BLUESCREEN3D
27-06-2003, 14:27
folgendes shell-script soll etwas tun, sobald zwei dateien unterschiedlich sind:
if [ `diff datei1 datei2` ]; then
echo "bla";
fi
falls die dateien nun aber unterschiedlich sind, werden alle verschiedenen zeilen in die eckigen klammern gepackt und das wird wegen zu vielen argumenten nicht interpretiert...
gibt es eine möglichkeit, statt der ausgabe des befehls den rückgabe-wert einzusetzen, oder das irgendwie anders zu lösen?
diff file1 file2 > /dev/null 2>&1
if [ "$?" = "1" ]; then
echo "blah"
fi
gruss,
pitu
Original geschrieben von BLUESCREEN3D
gibt es eine möglichkeit, statt der ausgabe des befehls den rückgabe-wert einzusetzen, oder das irgendwie anders zu lösen?
klar. geht ganz einfach:
if diff datei1 datei2 >/dev/null; then
...
fi
diff hat mehrere rückkehrcodes: 0 = keine unterschiede, 1 = unterschiede, 2 = fehler
such dir das passende aus.
-j
BLUESCREEN3D
27-06-2003, 16:44
Original geschrieben von pitu
diff file1 file2 > /dev/null 2>&1
kann man das nicht mit "diff file1 file2 2> /dev/null" abkürzen
Du hast mehrere ... nennen wir es pipes.
STDIN ist sozusagen 0
STDOUT ist 1
STDERR ist 2
Wenn du es nur mit 2>/dev/null machst, werden zwar alle Fehlermeldungen (STDERR) nach /dev/null geschrieben, aber nicht die normale Ausgabe (STDOUT).
Bei diesem Beispiel wird die normale Ausgabe (STDOUT=1) nach /dev/null umgeleitet, da du die ja nicht auf dem Schirm haben willst. die 1 muss man in diesem Fall nicht expliziet angeben, ansonsten hiesse es 1>/dev/null.
Ausserdem wird SDTERR nach STDOUT umgeleitet (2>&1) damit verschwindet es dann ebenfalls in /dev/null, da STDOUT ja dorthin umgeleitet wird. Das & bedeutet nur, dass du die Augabe nicht in ein File "1" umleitest.
gruss,
pitu
BLUESCREEN3D
27-06-2003, 18:20
Jaspers Post hab ich ja ganz übersehen - sowas wollte ich haben ^^
@pitu, das mit de stdou, stderr usw. kenn ich, aber darum geht es doch garnicht - ich meine nur, dass man deinen befehl auch mit einem einfachen "&>" abkürzen kann...
achso, sorry ;)
Du hast recht, natuerlich kann man es auch abkuerzen, aber ich persoenlich halte das fuer eine stilfrage, so wie
for i in *; do
for i in *
do
wuensche dir eine gute nacht, man liest sich
gruss,
pitu
BLUESCREEN3D
27-06-2003, 22:27
Original geschrieben von pitu
achso, sorry ;)
Du hast recht, natuerlich kann man es auch abkuerzen, aber ich persoenlich halte das fuer eine stilfrage
das kenn ich :)
z.B. bei C++ kann ich mir nicht erklären, warum die meisten Leute sowas wie
int main() {
cout << "hello, world" << endl;
}
machen, anstatt die zusammengehörigen Klammern eines Blockes übersichtlich untereinander zu setzen:
int main()
{
cout << "hello, world" << endl;
}
Original geschrieben von pitu
diff file1 file2 > /dev/null 2>&1
if [ "$?" = "1" ]; then
echo "blah"
fi
das ist besser:
if [ $? -eq 1 ]; then
echo "blah"
"=" ist für stringvergleiche. dein beispiel klappt zwar meistens, aber halt nicht immer (führende/nachfolgende leerzeichen)
-j
Original geschrieben von BLUESCREEN3D
das kenn ich :)
z.B. bei C++ kann ich mir nicht erklären, warum die meisten Leute sowas wie
int main() {
cout << "hello, world" << endl;
}
machen, anstatt die zusammengehörigen Klammern eines Blockes übersichtlich untereinander zu setzen:
int main()
{
cout << "hello, world" << endl;
}
Das kann ich dir erklaeren. Das haengt von der logischen Betrachtungsweise des Codes ab.
Die erste Betrachtungsweise ist dem nachempfunden, wie du es auch selber gesagt hast, dass nach dem "if" entweder ein einzelner Befehl, oder ein gesammter Block kommt. Du fasst also bei dieser Betrachtungsweise den Block als solches in einer logischen, gemeint ist formatier, Strucktur, die dem Kontrollbefehl folgt.. Die Klammer beginnen und schliessen damit den Block.
Zu vergleichen ist das in etwa mit folgendem Shell-konstrukt:
for i in *
do
irgendetwas
done
Hier wird das do vom done geschlossen und entspricht damit deinem zweiten, favorisierten Konstrukt.
Ich persoenlich favoriesiere das Konstrukt deines erstn Beispiels. Hierbei ist die Sichtweise auf das Kontrollelement ausgerichtet. Das heisst, dass ich mit dem Kontrollelement, wenn es zutrifft, etwas starte und ich daher die durchfuehrung des Kontrollelements schliesse. Dies entspreich folgendem Shellkonstrukt:
if [ $i -eq 0 ]; then
irgendetwas
fi
(gruss an jasper ;) )
Wie du hier sehr leicht sehen kannst, wird hier wirklich das if mit dem fi geschlossen.
Ich benutzer Syntaxhighlighting, und wenn ich di klammer darueber schreibe, dann habe ich in der Zeile in der der Block anfaengt ein highlighting, und damit einfach von der Sichtweise her die dazugehoerige Kontrollstruktur.
Oder mit anderen Worten, bei der einen sichtweise gehoeren Kontrollelement und Block untrennbar zusammen und in der anderen Sichtweise folgt der Block einem Kontrollelement.
Sichtweise rein formatierungstechnisch gesehen.
gruss,
pitu
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.