shell script で日付ループ

フォーマットの確認とかするループ処理を書いた。そのスニペットを残した。

BSD版の date コマンドでも似た動きをするように書き換えました

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
loop_date() {
  __internal_format='%Y-%m-%d %H:%M:%S'
  if [ "$(uname)" = "Darwin" ]; then
    load_cmd='date -j -f %Y-%m-%d '
    instep_cmd() {
      date -v "$2" -j -f "$__internal_format" "$1" "+$3"
    }
    default_step=+1d
  else
    load_cmd='date -d '
    instep_cmd() {
      date -d "$1 $2" "+$3"
    }
    default_step=1day
  fi

  start=$1
  end=$2
  format=${3:-%Y-%m-%d}
  step=${4:-"$default_step"}

  idx="$($load_cmd "$start" "+$format")"
  __idx="$($load_cmd "$start" "+$__internal_format")"
  if [ "$?" != "0" ];
  then
    echo "invalid format(\$start:$start)" >&2
    return 1
  fi
  __end="$($load_cmd "$end" "+$__internal_format")"
  if [ "$?" != "0" ];
  then
    echo "invalid format(\$end:$end)" >&2
    return 1
  fi
  while [ 1 ] ; do
    echo $idx
    if [ "$__idx" = "$__end" ] ; then
      break
    fi
    idx="$(instep_cmd "$__idx" "$step" "$format")"
    __idx="$(instep_cmd "$__idx" "$step" "$__internal_format")"
  done
}
comments powered by Disqus