Wie kann ich in derselben if/then-Bash-Skriptanweisung nach einer Zeichenfolgenübereinstimmung UND einer leeren Datei suchen?

Wie kann ich in derselben if/then-Bash-Skriptanweisung nach einer Zeichenfolgenübereinstimmung UND einer leeren Datei suchen?

Ich schreibe ein einfaches Bash-Skript, um Folgendes zu tun:

1) Überprüfen Sie zwei Dateien (foo1 und foo2).

2) Wenn foo1 sich von foo2 unterscheidet und foo1 NICHT leer ist, senden Sie eine E-Mail.

3) Wenn foo1 gleich foo2 ist … oder foo1 leer ist … nichts tun.

Der leere Zustand verwirrt mich. Hier ist, womit ich anfangen muss:

diff --brief <(sort ./foo1) <(sort ./foo2) >/dev/null
comp_value=$?

if [ $comp_value -ne 0 ]
then
        mail -s "Alert" [email protected] <./alertfoo

fi

Offensichtlich wird hier nicht nach leeren Inhalten gesucht. Irgendwelche Ideen, wie das geht?

Antwort1

-sSie können den Operator des Tests verwenden , um zu prüfen, ob die Datei leer ist. Dies cmpist im Allgemeinen die einfachste Möglichkeit, Dateien auf Gleichheit zu prüfen (beachten Sie, dass Sie einen Befehl direkt in einer ifAnweisung verwenden können, als einfachere Alternative zum Vergleichen des Beendigungsstatus mit 0). Ich behalte den Teil bei, in dem Sie die beiden Dateien sortieren, bevor Sie sie vergleichen. Wenn dies nicht erforderlich ist, verwenden Sie die beiden Dateien einfach direkt als Argumente für cmp.

if [ -s ./foo1 ] && ! cmp -q <(sort ./foo1) <(sort ./foo2); then
    ...

Sie können das Obige so lesen: „wenn ./foo1 nicht leer ist ( [ -s ... ]) UND ( &&) die sortierten Formen von ./foo1 und ./foo2 NICHT ( !) gleich sind ( cmp)“.

Antwort2

Mit -s können Sie prüfen, ob eine Datei leer ist:

if [[ -s $FILE ]] ; then
echo "$FILE has data."
else
echo "$FILE is empty."
fi

Wenn Sie wissen möchten, ob eine Zeichenfolge leer ist oder nicht, verwenden Sie die Option -z, um zu prüfen, ob sie leer ist:

STRING="test"
if [[ -n "$STRING" ]]; then
    echo "String is not empty"
fi

oder -n um zu prüfen, ob es nicht leer ist:

STRING=""
if [[ -z "$STRING" ]]; then
    echo "String is empty"
fi

verwandte Informationen