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

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

入力内容を読み取るスクリプトを作成したいと思います。たとえば、スクリプト名が "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行のコメントを削除します。

答え2

[[これは実際にはコマンドであり、他のコマンドと同様に引数を区切るにはスペースが必要です。

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

答え3

$ドルと変数の間にスペースがありますmonth

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

それが必要です:

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

答え4

「%Y-%m-%d」または「%m/%d/&Y」の形式で日付を入力した場合 (例: 2020-11-29 または 11/29/2020)、gnu を使用して次のことができますあります。次のように日付有効日付(gdate)を確認してください。

gdate -d "$1" +'%Y-%m-%d' > /dev/null 2>&1  # don't display any output
status=$(echo $?)                           # get error code
if [[ $status = 1 ]]                        # if date is invalid
then
  { echo "This date doesn't exist. Enter valid date!"; exit 1; }
else
  ...

私の質問が正確で、これが誰かに役立つことを願っています。もちろんそれは私に効果的です:)

関連情報