Как я могу проверить, находится ли $ date1 перед $ date2 в оболочке?

Просто для уточнения превосходный ответ DravSloan, нет никакого несоответствия. * расширен в обоих случаях оболочкой, и в обоих случаях она расширяется до точно того же самого. Различие находится в пути echo и ls рассматривайте их аргументы.

echo просто распечатает каждый из аргументов, которые Вы даете ему. ls будет list directory contents поскольку в руководстве говорится. Так, в обоих случаях оболочка выполняет программу слева (echo или ls) и рассматриваемая программа делает то, что она, как предполагается, делает с каждым из ее аргументов. Результат отличается, потому что программы отличаются, не потому что * расширен по-другому.

3
17.10.2015, 02:33
2 ответа

, если вы хотите быть по-настоящему дерзким, вы всегда можете преобразовать даты, основанные на эпохе 1970-01-01 00:00:00 УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ.

#added to fix DD/MM/YY format
input1=`echo $1 | awk -F "/" '{print $2"/"$1"/"$3}'`
input2=`echo $2 | awk -F "/" '{print $2"/"$1"/"$3}'`

date1=`date +%s --date="$input1"`
date2=`date +%s --date="$input2"`
if [[ "$date1" -lt "$date2" ]]; then
    echo "$1 earlier than $2"
else
    echo "$1 not earlier than $2"
fi
3
27.01.2020, 21:12

Сначала разделите его на поля, так как вам нужно будет их переставить. ГГГГММДД или ГГГГММДД намного лучше подходят для такого рода операций сравнения, поскольку они могут просматривать сразу всю строку.

IFS="/" date1a=($date1) date2a=($date2)

Затем, если вам нужно иметь дело с годами до 1999 года, зафиксируйте двузначные годы как четыре цифры, иначе 99 больше 01.

((date1a[2] += (date1a[2] < 70 ? 2000 : 1900)))
((date2a[2] += (date2a[2] < 70 ? 2000 : 1900)))

Затем сложите их обратно в порядке ГГГГММДД:

date1b="${date1a[2]}${date1a[1]}${date1a[0]}"
date2b="${date2a[2]}${date2a[1]}${date2a[0]}"

А теперь вы можете сравнить их:

if (( $date1b < $date2b )); then
    echo "earlier"
else
    echo "later"
fi

Примечание: это специфичный для bash ответ, в зависимости от особенностей, специфичных для bash (и ksh), не указанных в POSIX, и поэтому может не работать с / bin / sh или оболочка по умолчанию в некоторых системах.


POSIX требует другого подхода; вы можете положиться на awk , чтобы сделать часть тяжелой работы:

awkscr='BEGIN {FS="/"}; {print $3+($3<70?2000:1900) $2 $1}'
date1b=$(echo "$date1" | awk "$awkscr")
date2b=$(echo "$date2" | awk "$awkscr")
if [ "$date1b" -lt "$date2b" ]; then
    echo "earlier"
else
    echo "later"
fi
4
27.01.2020, 21:12

Теги

Похожие вопросы