Wie vergleicht man zwei Daten in einer Shell?

Wie vergleicht man zwei Daten in einer Shell?

Wie können zwei Daten in einer Shell verglichen werden?

Hier ist ein Beispiel, wie ich es verwenden möchte, obwohl es so nicht funktioniert:

todate=2013-07-18
cond=2013-07-15

if [ $todate -ge $cond ];
then
    break
fi                           

Wie erreiche ich das gewünschte Ergebnis?

Antwort1

Die richtige Antwort fehlt noch:

todate=$(date -d 2013-07-18 +%s)
cond=$(date -d 2014-08-19 +%s)

if [ $todate -ge $cond ];
then
    break
fi  

Beachten Sie, dass hierfür GNU date erforderlich ist. Die entsprechende dateSyntax für BSD date(wie sie standardmäßig in OSX zu finden ist) lautetdate -j -f "%F" 2014-08-19 +"%s"

Antwort2

Kann einen Zeichenfolgenvergleich im KSH-Stil verwenden, um die chronologische Reihenfolge [von Zeichenfolgen im Format Jahr, Monat, Tag] zu vergleichen.

date_a=2013-07-18
date_b=2013-07-15

if [[ "$date_a" > "$date_b" ]] ;
then
    echo "break"
fi

Glücklicherweise werden [Zeichenfolgen im Format JJJJ-MM-TT], wenn sie in alphabetischer Reihenfolge sortiert* werden, auch in chronologischer Reihenfolge sortiert*.

(* - sortiert oder verglichen)

In diesem Fall ist nichts Ausgefallenes nötig. Juhu!

Antwort3

Ihnen fehlt das Datumsformat für den Vergleich:

#!/bin/bash

todate=$(date -d 2013-07-18 +"%Y%m%d")  # = 20130718
cond=$(date -d 2013-07-15 +"%Y%m%d")    # = 20130715

if [ $todate -ge $cond ]; #put the loop where you need it
then
 echo 'yes';
fi

Auch Dir fehlen Looping-Strukturen, wie willst Du an weitere Termine kommen?

Antwort4

Der Operator -gefunktioniert nur mit ganzen Zahlen, und das sind Ihre Daten nicht.

Wenn Ihr Skript ein Bash-, KSH- oder ZSH-Skript ist, können Sie <stattdessen den Operator verwenden. Dieser Operator ist in Dash oder anderen Shells, die nicht viel über den POSIX-Standard hinausgehen, nicht verfügbar.

if [[ $cond < $todate ]]; then break; fi

Sie können die Zeichenfolgen in jeder Shell unter Beibehaltung der Datumsreihenfolge in Zahlen umwandeln, indem Sie einfach die Bindestriche entfernen.

if [ "$(echo "$todate" | tr -d -)" -ge "$(echo "$cond" | tr -d -)" ]; then break; fi

Alternativ können Sie es auch traditionell machen und das exprDienstprogramm verwenden.

if expr "$todate" ">=" "$cond" > /dev/null; then break; fi

Da das Aufrufen von Unterprozessen in einer Schleife langsam sein kann, möchten Sie die Transformation möglicherweise lieber mithilfe von Shell-String-Verarbeitungskonstrukten durchführen.

todate_num=${todate%%-*}${todate#*-}; todate_num=${todate_num%%-*}${todate_num#*-}
cond_num=${cond%%-*}${cond#*-}; cond_num=${cond_num%%-*}${cond_num#*-}
if [ "$todate_num" -ge "$cond_num" ]; then break; fi

Wenn Sie die Daten zunächst ohne Bindestriche abrufen können, können Sie sie natürlich mit vergleichen -ge.

verwandte Informationen