bashスクリプトは "cal"コマンドを使用してユーザー入力を読み取り、日付を検証します。

bashスクリプトは

入力内容を読み取るスクリプトを作成したいと思います。たとえば、スクリプト名が "check" の場合、"check 9 4 1993" と入力すると、入力内容が cal コマンドとカレンダーチェックで有効な日付であることが確認されます。 )。

私の考えでは、calコマンドによる入力でエラーが発生した場合は有効な日付ではありません。私はこのドラフトにいくつかの深刻なエラーがあることを知っています(私の入力がcalコマンドを通過する方法を知りません)。しかし、いくつかのアドバイスをいただきありがとうございます。とにかくドラフトは次のとおりです。

#!/bin/bash

day=$1; month=$2; year=$3
day=$(echo "$day" | bc)
month=$(echo "$month" | bc)
year=$(echo "$year" | bc)

cal $day $ month $year 2> /dev/null
if [[$? -eq 0 ]]; then
   echo "This is a valid date"
else
   echo "This is an invalid date"
fi

ベストアンサー1

私が確認したいくつかのLinuxディストリビューション(Ubuntu 14.04など)では、パッケージングはcal​​GNU CoreutilsではなくBSDで提供されています。 BSD版は日付を月と年だけで受け入れないようです。 Ubuntuバージョンには-H YYYY-MM-DDオプションがありますが、これは役に立たないようです。

代わりにこのユーティリティを使用しますdate。 LinuxでGNU Coreutilsを想定すると、次のようにスクリプトを再構築します。

#!/bin/bash

day=$((10#$1))
month=$((10#$2))
year=$((10#$3))

if date -d $year-$month-$day > /dev/null 2>&1; then
    # cal $month $year
    echo "This is a valid date"
else
    echo "This is an invalid date"
fi

メモ:

  • 私はシェルに付属のものを使用しています。算術拡張bc各引数に対して新しいプロセスを作成する代わりに、入力を検証し、先行ゼロを削除します。
  • 使っていますGNU日付入力日の解析
  • date コマンドはif条件式として直接使用できます。 ifプロセス終了コードを確認して動作します。[あるいは、[[実行可能ファイルが通常は代わりに使用されますが、他のプログラムが便利な終了コードで終了している場合は、それを使用する理由はありません。
  • cal本当に正確な日付の出力が欲しいのかわかりません。これを行うには、そのcal行のコメントを削除します。

おすすめ記事