私のシェルスクリプトを見てください
#!/bin/sh
aaa=20200101101010
bbb=$(date -d "$aaa -5 minutes" +'%Y%m%d%H%M%S')
echo $bbb
私は欲しい:
20200101100510
しかし、結果は次のようになります。
20200101101009235500
どうしたの?
aaaから5分を引くには?
見たい 20200101100510
答え1
date
これを現地時間20200101101010
として解釈するGNU実装を使用する必要があります。2020010110-10-10T00:00:00
-d
はい、非標準オプションdate
、いくつかの実装でのみサポートされており、それをサポートする実装で日付を入力したい場合(たとえば、GNU、busybox、ast-open date
、BSDは代わりにdate
使用)、他の実装ではそこにあります。は違います。-r
-v
ast-open
また、busyboxを使用すると、オフセットAFAIKがなくてもdate
入力形式(busybox with -D
、ast-open with)を指定できます。-p
ただし、最初にエポック時間に変換して5分を削除し、300秒を削除してから、希望の形式に変換することもできます。
2019年7月、GNUに似たものを追加しようという提案がありました。date
しかし、まだリリースされていません(2020-01-21基準)。
特に、GNUの場合、date
まず$aaa
input()を認識可能な形式に変換できます。@RakeshShewaleのksh93
文法アプローチ。
zsh
別のオプションは、埋め込み不可能な動作に依存せずにタイムスタンプ解析と書式設定機能を備えたシェルを使用することですdate
。
zmodload zsh/datetime || exit
format=%Y%m%d%H%M%S min=60
aaa=20200101101010
strftime -r -s bbb -- "$format" "$aaa" || exit
strftime -s bbb -- "$format" "$((bbb - 5 * min))"
print -r -- "$bbb"
$format
他のフォーマットに対して必要に応じて調整できますが、すべてのフォーマットディレクティブがサポートされているわけではありませんstrftime()
。strftime
-r
滞在タイムスタンプ)strptime()
(発信者strftime -r
)分析するタイムスタンプ)。man 3 strftime
システムを確認してくださいman 3 strptime
。
答え2
a=20200101101010
bbb=$(date --date "${a:0:4}-${a:4:2}-${a:6:2} ${a:8:2}:${a:10:2}:${a:12:2}")
ccc=$(date -d "$bbb -5 mins" +'%Y%m%d%H%M%S')
echo $ccc
出力:
20200101100510