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來自 BSD 而不是 GNU Coreutils。 BSD版本似乎不接受days作為參數;只有幾個月和幾年。 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

筆記:

  • 我用的是shell附的算術展開驗證輸入/刪除前導零,而不是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
  ...

希望我的問題是正確的,這對某人有幫助。當然對我有用:)

相關內容