date
コマンド内で変数を使用したいと思います。私のシステムはGNU日付をサポートしていません。私はSunosを使用していますが、date
withオプションを使用すると誤った代替項目として-d
表示されます。-d
#!/usr/bin/ksh
RELEASE_DATE="28 OCT 2018"
RELEASE_DATE_MINUS_2=`date -"${RELEASE_DATE: -2} ${RELEASE_DATE:4:3} ${RELEASE_DATE:0:4} - 2 days" '+%Y-%m-%d'`
echo "Release is $RELEASE_DATE"
echo "release_date-2 is $RELEASE_DATE_MINUS_2
上記のコードスニペットを試してみました。release_date
この入力など、他のファイルから取得した実際のデータを渡す必要があり、その日付の2日前にそのような入力を受け取る必要があります。.cnf
28OCT2018
2018-10-26
答え1
シェルを含むzsh
:
zmodload zsh/datetime
rel_date=2018OCT28
strftime -rs d %Y%b%d.%H $rel_date.12 &&
strftime -s two_days_before %Y-%m-%d $((d - 86400*2)) || exit
echo $two_days_before
答え2
Perl は次の目的で使用できます。
perl -MTime::Piece -slE 'say +(Time::Piece->strptime($date, "%Y%b%d") - 2 * 86_400)->ymd' -- -date="$rel_date"
着信日付変数の形式を指定してそれを時間オブジェクトとして解析し、日付算術を実行してから必要なYYYYY-mm-dd形式で出力します。
ここで録音されました:https://perldoc.perl.org/Time/Piece.html
答え3
シェルでタグ付けしたので、変数がシェルにある必要があると仮定しますが、参考までにシェル=
変数の周りにスペースを含めることはできません。
GNUはdate
その形式の入力日付を受け入れませんが、許可するので、28 OCT 2018
シェル引数拡張を使用して日付を並べ替えることができます(常に同じ形式である限り)。
date -d "${rel_date: -2} ${rel_date:4:3} ${rel_date:0:4}"
これで2日を引くには、次のように追加します。
date -d "${rel_date: -2} ${rel_date:4:3} ${rel_date:0:4} - 2 days"
要求された形式で出力します。
date -d "${rel_date: -2} ${rel_date:4:3} ${rel_date:0:4} - 2 days" '+%Y-%m-%d'
答え4
どのksh {88,93}を使用しているかを知ることが役に立ちます。
ksh93(1) によると、日付に関するいくつかの情報を見つけることができます。
printf format [ arg ... ]
%(date-format)T
-- 実用的な例
: printf "%(%d.%m,%Y)T\n"
11.01,2019
: printf "%(%d.%m.%Y)T\n" "2 days ago"
09.01.2019