Дата: для параметра требуется аргумент

#bash #shell #date

#bash #оболочка #Дата

Вопрос:

Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?

У меня есть этот блок кода

   if [ -n "${MFA_Exp}" ]; then
    exp_sec="$(expr '(' $(date -d "${MFA_Exp}"  %s) - $(date  %s) ')' )";
    if [ "${exp_sec}" -gt 0 ]; then
      output =", MFA TTL: $(date -u -d @"${exp_sec}"  "%Hh %Mm %Ss")";
    else
      output =", MFA DEAD!";
    fi;
 

это должно вывести время истечения срока действия моего токена MFA, но я получаю эту ошибку

 date: option requires an argument -- d
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[ |-]val[ymwdHMS]] ...
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [ format]
 

Я на Macbook, и я подозреваю, что это как-то связано с форматом даты.
Я просто не уверен, что это такое.

Комментарии:

1. Скорее всего, вы используете синтаксис FreeBSD на macOS date . Тот, который вы опубликовали, зависит от -d GNU

2. Кстати, вам не нужно expr : exp_sec=$(( $(date ...) - $(date %s) )) .

Ответ №1:

Формат даты по умолчанию для BSD date [[[mm]dd]HH]MM[[cc]yy][.ss]] . Если MFS_Exp он находится в этом формате, вы можете использовать

 exp_sec=$(( $(date -j "$MFS_Exp"  %s) - $(date  %s) ))
 

Если нет, вам нужно указать формат ввода с помощью -f параметра. Например, если ваша строка похожа 2020-12-18 12:34:56 , тогда используйте date -j -f '%Y-%m-%d %H:%M:%S' "$MFS_Exp" %s .

Для второго вызова я бы date вообще не рекомендовал использовать, поскольку вы работаете с продолжительностью, а не с меткой времени.

 hours=$(( exp_sec / 3600 ))
rem=$(( exp_sec % 3600 ))
minutes=$(( rem / 60 ))
sec=$(( rem % 60 ))
output =", MFA TTL: ${hours}h ${minutes}m ${sec}s"
 

Комментарии:

1. Вот как выглядит вывод моей строки 2020-12-20T23:28:16 00:00 . Мне просто нужно определить формат ввода для этого.

2. %Y-%m-%dT%H:%M%S 00:00 .

3. Он выдает эту ошибку Failed conversion of ``2020-12-21T02:00:12 00:00'' using format ``%Y-%m-%dT%H:%M%S 00:00'' , я чувствую, что сейчас делаю что-то не так, но я не уверен, что это такое.

4. Я пропустил двоеточие между %M и %S .