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, похоже, не принимает дни в качестве параметра; только месяцы и годы. В версии Ubuntu есть опция -H YYYY-MM-DD, но она, похоже, не помогает.

Вместо этого я бы использовал dateутилиту. Предполагая GNU Coreutils под Linux, я думаю, я бы переписал ваш скрипт примерно так:

#!/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 date (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
  ...

Надеюсь, я правильно задал вопрос и это кому-то поможет. Мне точно помогло :)

Связанный контент