#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
GNU2. Кстати, вам не нужно
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
.