web-dev-qa-db-ja.com

ユーザー入力を読み取り、「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
3
grinke

私がチェックした一部のLinuxディストリビューション(Ubuntu 14.04など)では、パッケージ化されたcalはBSDからのものであり、GNU Coreutilsではありません。BSDバージョンは受け入れないようです。パラメータとしての日数。月と年のみ。Ubuntuバージョンには-HYYYY-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 を使用して入力日付を解析しています
  • Dateコマンドは、if条件式として直接使用できます。 ifは、プロセスの終了コードをチェックすることで機能します。一般的に[または[[実行可能ファイルが代わりに使用されますが、有用な終了コードで終了する場合、他のプログラムを使用できる理由はありません。
  • 正しい日付のcal出力が実際に必要かどうかはわかりません。その場合は、cal行のコメントを解除してください。
3
Digital Trauma

あなたのドルの間にスペースがあります$およびmonth変数:

cal $day $ month $year 2> /dev/null

そのはず:

cal $day $month $year 2> /dev/null
1
geedoubleya

[[は実際にはコマンドであり、他のコマンドと同様に、引数を区切るために空白が必要です。

if [[ $? -eq 0 ]]; then
# ...^
1
glenn jackman