web-dev-qa-db-ja.com

bashシェルの日付解析、特定の日付から開始し、月の毎日をループします

1日から始まるbashシェルスクリプトを作成してから、%Y_%m_dとして出力される後続の各日のフォーマットをループする必要があります。

開始日を送信してから、日数の別のパラメーターを送信できると思います。

私の問題/質問は、日付(現在ではない)を設定してから日を追加する方法です。

だから私の入力は2010_04_016になります

私の出力は

2010_04_01
2010_04_02
2010_04_03
2010_04_04
2010_04_05
2010_04_06
12
Joe Stein
[radical@home ~]$ 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

これで、paramsを使用してこのスクリプトを呼び出すと、必要なものが返されます。

[radical@home ~]$ ./a.sh 2010_04_01 6
2010_04_01 2010_04_02 2010_04_03 2010_04_04 2010_04_05 2010_04_06
20
eRadical

非常に基本的な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

12
anonymous

注:ここでの解決策はどれもOS Xでは機能しません。たとえば、次のようなものが必要になります。

日付-v-1d +%Y%m%d

それはあなたのために昨日印刷されるでしょう。またはもちろんアンダースコア付き:

日付-v-1d +%Y_%m_%d

したがって、これを考慮に入れると、代わりにこのコマンドを使用して、これらの例のループの一部を調整できるはずです。 -vオプションを使用すると、日、分、秒、年、月などを簡単に加算または減算できます。-v+ 24dは24日を加算します。等々。

6
Tom
#!/bin/bash
inputdate="${1//_/-}"  # change underscores into dashes
for ((i=0; i<$2; i++))
do
    date -d "$inputdate + $i day" "+%Y_%m_%d"
done
2

非常に基本的なbashスクリプトでこれを実行できるはずです。

脚本:
#!/ bin/bash

start_date = 20100501
num_days = 5
for i in seq 1 $num_days
行う
日付= 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

1
anonymous

たとえば、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アカウントに

1
Gianluca Casati

コマンドラインオプション-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
0
Jürgen Hötzel