Просто для уточнения превосходный ответ DravSloan, нет никакого несоответствия. *
расширен в обоих случаях оболочкой, и в обоих случаях она расширяется до точно того же самого. Различие находится в пути echo
и ls
рассматривайте их аргументы.
echo
просто распечатает каждый из аргументов, которые Вы даете ему. ls
будет list directory contents
поскольку в руководстве говорится. Так, в обоих случаях оболочка выполняет программу слева (echo
или ls
) и рассматриваемая программа делает то, что она, как предполагается, делает с каждым из ее аргументов. Результат отличается, потому что программы отличаются, не потому что *
расширен по-другому.
, если вы хотите быть по-настоящему дерзким, вы всегда можете преобразовать даты, основанные на эпохе 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
Сначала разделите его на поля, так как вам нужно будет их переставить. ГГГГММДД или ГГГГММДД намного лучше подходят для такого рода операций сравнения, поскольку они могут просматривать сразу всю строку.
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