Як відформатувати вихідну дату з пробілами як змінною у сценарії?


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.

Який правильний спосіб зробити це, щоб команда дати отримати один правильний аргумент?


Як бічна примітка, рядок формату дати можна скоротити, "%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 відповідь оновлена
jordanm

1
Я отримую date: extra operand ‘’помилки з обома підходами вище
Джефф Пукетт

3

Я погоджуюсь, що найкращим способом є функція. В якості альтернативи просто зберігайте формат як змінну, а не всю команду:

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

1
@Kusalananda: Цілком правильно. Дякую! Оновили відповідь
Адам

І, гм, вибачте, але echoзаміна і заміни команд також зайва.
Kusalananda

1
Так, технічно вони були зайвими в прикладі, який я використовував (я можу стверджувати, що вони створюють більш читабельний код, але це питання смаку). Оновились, щоб використовувати приклад з ОП, і в такому разі вони потрібні
Адам,

Так, цей приклад має більше сенсу.
Kusalananda

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'


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"

-1

Була така ж проблема; довелося вписати дату у дивну роздруківку, щоб обробити ослабленим. я використав

DATE1=`date +%Y-%m-%d`

DATE2=`date +%T`

потім

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc

1
Чи можете ви пояснити, як саме це відповідає на питання?
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.