Чтобы попросить пользователя ввести дату «пока», он не вводит дату, в bash linux - PullRequest
0 голосов
/ 10 октября 2019

Я нашел способ проверить с помощью оператора if, что ввод соответствует шаблону даты и не является эксцентрической датой .

Соответственно:

  • if [[ $dateinput =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]
  • date -d "$dateinput"

И они работают.

Я пытался применить его как можно в цикле while как:

dateinput="1992-01-01" #voluntarily made in order to see if the while statement is ok
while [ ! date -d "$dateinput" ]; do
    read -p "Indicate a date please: " Date
    dateinput=$Date
done

В результате он отображает текст приглашения Indicate a date please:, затем отображает script.sh: line 73: [[! : command not found, где строка 73: while [ ! date -d "$dateinput" ]; do. Кроме того, переменная dateinput не существует никогда после нее, потому что она не будет отображать echo "the input date is: ${dateinput}", но продолжает читать и отображать остальные строки скрипта.

Что я могу сделать, чтобы выполнить ее?


bash версия: 4.4.20 |Версия ОС: Ubuntu 18.04.3 LTS.

Ответы [ 3 ]

2 голосов
/ 10 октября 2019

Вы можете сбросить квадратные скобки или добавить «$ ()» к вашей команде даты следующим образом:

 while [ ! "$(date -d "${dateinput}")" ]; do 
     read -p "Indicate a date please: " dateinput
 done

или

 while ! date -d "${dateinput}" > /dev/null 2>&1; do
     read -p "Indicate a date please: " dateinput
 done

Вам не нужно > /dev/null 2>&1 но без него будет напечатана дата вывода

1 голос
/ 10 октября 2019
while test -z "$date"; do
    read -p "Indicate a date please: " dateinput;
    if [[ $dateinput =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
        date="$(date -d "$dateinput")";
        if ! test $?; then
            date=""
        fi
    fi
done
echo input date is: "$date"

Приведенный выше код имеет цикл, который продолжает работать, пока $date пуст. Код внутри цикла запрашивает у пользователя дату и читает $dateinput. Если пользователь вводит строку, соответствующую вашему шаблону ([[ $dateinput =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]), тогда он запускает date -d и сохраняет вывод в $date. Если команда date не может распознать действительную дату из $dateinput (! test $? будет истиной), тогда для $date будет задана пустая строка, чтобы цикл снова запустился.

Этот цикл останавливается, когда пользователь вводит значение, соответствующее вашему шаблону, а также является допустимой строкой даты для команды date. Вывод команды date сохраняется в переменной $date.

Некоторая соответствующая документация:

  1. для $?: https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html#index-_0024_003f
  2. для test команда https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-test
0 голосов
/ 10 октября 2019

Чтобы проверить ввод как дату, вы можете выполнить 'date' и проверить код возврата - используя 'if date -d "...". '[' Разрешает доступ к ограниченному набору тестовых операторов

while true ; do
    read -p "Indicate a date please: " dateinput
    [[ "$dateinput" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$dateInput" >/dev/null && break
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...