Bash синтаксический анализ даты, начинается с определенной даты и цикла через каждый день месяца
Мне нужно создать оболочку bash script, начиная с дня, а затем пропустить каждый последующий формат дня, который выводится как% Y_% m_d
Я полагаю, что могу отправить начальный день, а затем еще один параметр для количества дней.
Моя проблема/вопрос в том, как установить DATE (это не сейчас), а затем добавить день.
поэтому мой ввод будет 2010_04_01 6
мой вывод будет
2010_04_01
2010_04_02
2010_04_03
2010_04_04
2010_04_05
2010_04_06
Ответы
Ответ 1
[[email protected] ~]$ cat a.sh
#!/bin/bash
START=`echo $1 | tr -d _`;
for (( c=0; c<$2; c++ ))
do
echo -n "`date --date="$START +$c day" +%Y_%m_%d` ";
done
Теперь, если вы вызываете этот script с вашими параметрами, он возвращает то, что вы хотели:
[[email protected] ~]$ ./a.sh 2010_04_01 6
2010_04_01 2010_04_02 2010_04_03 2010_04_04 2010_04_05 2010_04_06
Ответ 2
Очень простой bash-скрипт должен уметь это делать:
#!/bin/bash
start_date=20100501
num_days=5
for i in 'seq 1 $num_days'
do
date='date +%Y/%m/%d -d "${start_date}-${i} days"'
echo $date # Use this however you want!
done
Выход:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26
Ответ 3
Примечание. НЕТ РЕШЕНИЙ здесь будет работать с OS X. Вам понадобится, например, что-то вроде этого:
date -v-1d +% Y% m% d
Это будет распечатано вчера для вас. Или, конечно же, с подчеркиванием:
date -v-1d +% Y_% m_% d
Итак, учитывая это, вы должны настроить некоторые из циклов в этих примерах с помощью этой команды. Опция -v легко позволит вам добавлять или вычитать дни, минуты, секунды, годы, месяцы и т.д. -v + 24d добавит 24 дня. и т.д.
Ответ 4
#!/bin/bash
inputdate="${1//_/-}" # change underscores into dashes
for ((i=0; i<$2; i++))
do
date -d "$inputdate + $i day" "+%Y_%m_%d"
done
Ответ 5
Очень простой bash script должен быть в состоянии сделать это.
Script:
#!/bin/bash
start_date = 20100501
num_days = 5
для я в seq 1 $num_days
сделать
date = date +%Y/%m/%d -d "${start_date}-${i} days"
echo $date # Используйте это, как хотите!
сделано
Результат:
2010/04/30
2010/04/29
2010/04/28
2010/04/27
2010/04/26
Ответ 6
Вы также можете использовать cal, например
YYYY=2014; MM=02; for d in $(cal $MM $YYYY | grep "^ *[0-9]"); do DD=$(printf "%02d" $d); echo $YYYY$MM$DD; done
(изначально размещен здесь, в моей учетной записи commandlinefu)
Ответ 7
Вы можете передать дату через опцию командной строки -d в отношении даты GNU с несколькими форматами ввода:
http://www.gnu.org/software/coreutils/manual/coreutils.html#Date-input-formats
Пропустить стартовую дату в качестве аргумента командной строки или использовать текущую дату:
underscore_date=${1:-$(date +%y_%m_%d)}
date=${underscore_date//_/-}
for days in $(seq 0 6);do
date -d "$date + $days days" +%Y_%m_%d;
done
Ответ 8
вы можете использовать gawk
#!/bin/bash
DATE=$1
num=$2
awk -vd="$DATE" -vn="$num" 'BEGIN{
m=split(d,D,"_")
t=mktime(D[1]" "D[2]" "D[3]" 00 00 00")
print d
for(i=1;i<=n;i++){
t+=86400
print strftime("%Y_%m_%d",t)
}
}'
Выход
$ ./shell.sh 2010_04_01 6
2010_04_01
2010_04_02
2010_04_03
2010_04_04
2010_04_05
2010_04_06
2010_04_07