Linuxの日付解析をFreeBSDに移植

Linuxの日付解析をFreeBSDに移植

次の形式の日付があります。date -d $datum +"%Y-%m-%d"Linuxではうまく機能しますが、FreeBSDでは次のように表示されます。

ERROR wrong format
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]

これに対する答え:

date -d $datum +"%Y-%m-%d" >/dev/null 2>&1 || echo "ERROR wrong format" 

ただし、エラーを印刷して、正しいように見えるコードを実行し続けます。エラーを出力せず、エラーがある場合にプログラムが終了しないようにするにはどうすればよいですか?

答え1

テストするbsdボックスはありませんが、次のようなものを使用する必要があるようです:

date -f "some format" "$datum" "+%Y-%m-%d"

そして、解析を可能にするために着信データをフォーマットする必要があります。

答え2

LinuxでおなじみのGNUバージョンは、他のほとんどのUnixバリアントバージョンよりもdate多くの日付形式をサポートしています。dateまた、他のUnixバリアントでは見られない多くのオプションがあります。ただ基準の使用法は、パラメータdateで指定された形式+…(システム管理者がシステム日付を設定する方法でもあります)に従って現在の日付を表示し、ローカルタイム-uゾーンの代わりにUTCを指定するオプションです。

存在するFreeBSD、このdateユーティリティを使用すると、オプションを使用して日付形式間を変換できます-f。たとえば、date -f %s "$datum" +%Y-%m-%dエポックで秒単位で表される日付を人間が読める形式に変換できます。

素晴らしい日付を解析したい場合は、coreutilsGNU日付を含むこのパッケージをインストールできます。またはあなたは使用することができますDate::ParsePerlのモジュールまたはdateutilPythonで。


ほとんどのエラーでシェルスクリプトを停止するには、次を追加します。set -e#!その線のすぐ下にあります。

エラーを明示的に表示するには、エラー状態でスクリプトを終了する必要があります。 stdoutの代わりにstderrにエラーを出力します。

date -d "$datum" +"%Y-%m-%d" >/dev/null 2>&1 || {
  echo "ERROR wrong format" >&2
  exit 1
}

または

if ! date -d "$datum" +"%Y-%m-%d" >/dev/null 2>&1; then
  echo "ERROR wrong format" >&2
  exit 1
fi

関連情報