
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 date
Syntax 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 -ge
funktioniert 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 expr
Dienstprogramm 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
.