¿Cómo formatear la salida de fecha con espacios como variable en el script?

13

Quiero hacer el datecomando con un formato agradable como este:

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

Pero quiero guardar esto en variable, para poder llamar desde un script como este: echo "$(nice_date) [WARNING] etc etc"

Sin embargo, no funciona

$ 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.

¿Cuál es la forma correcta de hacer esto, para que el comando date obtenga un argumento correcto?

Gilbertasm
fuente
Como nota al margen, su cadena de formato de fecha puede acortarse "%F %T"si está utilizando GNU date.
jordanm
El problema es el espacio. Si lo usas nice_date="date +%Y-%m-%d-%H:%M:%S", funciona. Actualmente no puedo ver cómo proteger ese espacio del segundo shell.
MadHatter

Respuestas:

13

La razón por la que su ejemplo falla es por la forma en que funciona la división de palabras del shell. Cuando ejecuta "$($nice_date)", el shell está ejecutando el datecomando con dos argumentos, "+%Y-%m-%d"y "%H:%M:%S". Esto falla porque la cadena de formato para la fecha debe ser un argumento único.

La mejor manera de hacer esto es usar una función en lugar de almacenar el comando en una variable:

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"

Si realmente desea almacenar el comando en una variable, puede usar una matriz:

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

Para obtener más detalles sobre los casos complejos de almacenar un comando en una variable, consulte BashFAQ 050 .

jordanm
fuente
Gracias, pero tengo curiosidad por qué mi enfoque no funciona, ¿puede explicarlo?
gilbertasm
@gilbertasm respuesta actualizada
jordanm
1
Recibo date: extra operand ‘’errores con los dos enfoques anteriores
Jeff Puckett
3

Estoy de acuerdo en que una función es el mejor camino a seguir. Como alternativa, simplemente almacene el formato como una variable en lugar de todo el comando:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"
Adán
fuente
1
@Kusalananda: Muy bien. ¡Gracias! Han actualizado la respuesta
Adam
Y, um, lo siento, pero el echoy la sustitución de comandos también son superfluos.
Kusalananda
1
Sí, eran técnicamente superfluos en el ejemplo reducido que utilicé (podría argumentar que producen un código más legible, pero eso es una cuestión de gustos). Se han actualizado para usar el ejemplo del OP, en cuyo caso son necesarios
Adam
Sí, ese ejemplo tiene más sentido.
Kusalananda
1

La respuesta más corta es

#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'
Thanh Trung
fuente
1

Una manera fácil es simplemente 'escapar' del espacio con un \

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

Por favor pruebe lo siguiente:

Debe agregar el símbolo "` ", el símbolo que se encuentra en la tecla tilde del teclado. El símbolo dice que el shell debe ejecutar el comando primero y luego asignarlo a la variable.

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#
ZVIK
fuente
El mismo problema que la respuesta de Iain.
MadHatter
0

En lugar de:

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

Tratar:

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

Además, no necesita la última sustitución de comando:

date "$nice_date_format"
usuario1333144
fuente
-1

Tuve el mismo problema; Tuve que poner una fecha en una impresión awk para su procesamiento por splunk. solía

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

DATE2=`date +%T`

luego

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc
Mike Fester
fuente
1
¿Puedes explicar exactamente cómo responde esto a la pregunta?
G-Man dice 'Reincorporar a Monica'