Como formatar a saída de data com espaços como variável no script?

8

Eu quero fazer o comando date com formatação legal como esta:

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

Mas eu quero salvar isso em variável, então eu poderia chamar de script como este: echo "$(nice_date) [WARNING] etc etc"

No entanto, não 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.

Qual é a maneira correta de fazer isso, de modo que o comando date tenha um argumento correto?

    
por gilbertasm 17.09.2015 / 15:59

5 respostas

11

O motivo pelo qual seu exemplo falha é por causa da maneira como a divisão de palavras do shell funciona. Quando você executa "$($nice_date)" , o shell está executando o comando date com dois argumentos, "+%Y-%m-%d" e "%H:%M:%S" . Isso falha porque a string de formato para data deve ser um único argumento.

A melhor maneira de fazer isso é usar uma função em vez de armazenar o comando em uma variável:

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"

Se você realmente quisesse armazenar o comando em uma variável, você pode usar uma matriz:

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

Para mais detalhes sobre os casos complexos de armazenamento de um comando em uma variável, veja BashFAQ 050 .

    
por 17.09.2015 / 16:07
2

Concordo que uma função é o melhor caminho a percorrer. Como alternativa, simplesmente armazene o formato como uma variável em vez do comando inteiro:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"
    
por 17.09.2015 / 19:40
0

Por favor, experimente o seguinte:

Você precisa adicionar o símbolo "'" ao símbolo que está na tecla til no teclado. O símbolo diz o shell para executar o comando primeiro e depois atribuir à variável.

[root@RHEL01 ~]# My_Var='date +"%Y-%m-%d %H:%M:%S"'
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#
    
por 17.09.2015 / 16:08
0

Em vez de:

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

Tente:

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

Além disso, você não precisa da última substituição de comando:

date "$nice_date_format"
    
por 02.08.2016 / 10:13
0

A resposta mais curta é

#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'
    
por 11.08.2018 / 14:26

Tags