
Я хочу написать скрипт, который считывает мои входные данные (например, если мой скрипт называется «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
...
Надеюсь, я правильно задал вопрос и это кому-то поможет. Мне точно помогло :)