この if コマンドはどのように記述しますか?

この if コマンドはどのように記述しますか?

私のスクリプト名は 1 です。「1 2012 12 12」と入力すると、現在の日付カレンダーが表示されます。「1 2323232」のような無効な日付を入力すると、cal でエラーが発生します。エラーが発生した場合に「日付が無効です」とエコーするように、if ループにこれを配置するにはどうすればよいですか。

year=$(echo "$year" | bc)
month=$(echo "$month" | bc)
day=$(echo "$day" | bc)

cal $day $month $year

if [ $? -eq 0];
        then
        echo "Date is valid"
else
        echo "Date in not valid"
fi

答え1

これは機能しません:

cal $day $month $year

cal月と年の引数のみが必要です。次を試してください:

cal $month $year

月と年が無効な場合にメッセージを出力したい場合は、ループは必要ありません。次のコードは、月と年が有効な場合はカレンダーを表示し、有効でない場合はエラー メッセージを表示します。

cal $day $month $year 2>/dev/null || echo "Date is not valid."

次のステートメントは||、その前のステートメントがゼロ以外の戻りコード(エラーが発生したことを示す)で終了した場合にのみ実行されます。

余談

これらの行はあまり効果がないように見えます:

year=$(echo "$year" | bc)
month=$(echo "$month" | bc)
day=$(echo "$day" | bc)

変数yearmonthdayが有効な場合、これらの行は何も行いません。有効な数値でない場合は、bcキャッチされないエラーが出力されます。

関連情報