Как отформатировать вывод даты с пробелами как переменную в скрипте?


13

Я хочу сделать dateкоманду с хорошим форматированием, как это:

$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58

Но я хочу сохранить это в переменной, чтобы я мог вызывать из скрипта так: echo "$(nice_date) [WARNING] etc etc"

Однако это не работает

$ nice_date="date +%Y-%m-%d %H:%M:%S"
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S
Try 'date --help' for more information.

$ nice_date="date +\"%Y-%m-%d %H:%M:%S\""
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.

$ nice_date='date +"%Y-%m-%d %H:%M:%S"'
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"
Try 'date --help' for more information.

Какой правильный способ сделать это, чтобы команда date получила один правильный аргумент?


Как примечание, ваша строка формата даты может быть сокращена, "%F %T"если вы используете GNU date.
Иордания

Проблема в пространстве. Если вы используете nice_date="date +%Y-%m-%d-%H:%M:%S", это работает. В настоящее время я не вижу, как защитить это пространство от второй оболочки.
MadHatter

Ответы:


13

Причина, по которой ваш пример терпит неудачу, заключается в том, как работает разбиение слов в оболочке. При запуске "$($nice_date)"оболочка выполняет dateкоманду с двумя аргументами "+%Y-%m-%d"и "%H:%M:%S". Это терпит неудачу, потому что строка формата для даты должна быть единственным аргументом.

Лучший способ сделать это - использовать функцию вместо сохранения команды в переменной:

format_date() {
  # echo is not needed
  date "+%Y-%m-%d %H:%M:%S" "$1"
}
format_date
format_date "2015-09-17 16:51:58"
echo "$(format_date) [WARNING] etc etc"

Если вы действительно хотите сохранить команду в переменной, вы можете использовать массив:

nice_date=(date "+%Y-%m-%d %H:%M:%S")
# again echo not needed
"${nice_date[@]}" "2015-09-17 16:51:58"

Для получения более подробной информации о сложных случаях сохранения команды в переменной см. BashFAQ 050 .


Спасибо, но мне любопытно, почему мой подход не работает, можете ли вы уточнить это?
Гилбертасм

@gilbertasm ответ обновлен
Джордан

1
Я получаю date: extra operand ‘’ошибки с обоими подходами выше
Джефф Puckett

3

Я согласен, что функция - лучший путь. В качестве альтернативы просто сохраните формат как переменную, а не как целую команду:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"

1
@ Кусалананда: Совершенно верно. Спасибо! Обновили ответ
Адам

И, извините, но echoподстановка команд и команд также излишни.
Кусалананда

1
Да, они были технически излишни в урезанном примере, который я использовал (я могу утверждать, что они создают более читаемый код, но это вопрос вкуса). Обновились, чтобы использовать пример из OP, и в этом случае они необходимы
Адам

Да, этот пример имеет больше смысла.
Кусалананда

1

Кратчайший ответ

#if you want to store in a variable
now=$(date '+%F" "%T');
echo $now

#or direct output (single quote may not needed)
date '+%F" "%T'

1

Один простой способ - просто «покинуть» пространство с помощью

nice_date="date +%Y-%m-%d\ %H:%M:%S"

0

Пожалуйста, попробуйте ниже:

Вам необходимо добавить символ «», символ, который находится на клавише тильды на клавиатуре. Символ говорит оболочке сначала выполнить команду, а затем присвоить ее переменной.

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#

Та же проблема, что и в ответе Яна.
MadHatter

0

Вместо того:

nice_date="date +%Y-%m-%d %H:%M:%S"
echo "$($nice_date)"

Пытаться:

nice_date_format="+%Y-%m-%d %H:%M:%S"
echo $(date "$nice_date_format")

Также вам не нужна последняя подстановка команд:

date "$nice_date_format"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.