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


13

Eu quero fazer o datecomando com boa formatação como esta:

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

Mas eu quero salvar isso na variável, para que eu possa chamar do script assim: 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, para que o comando date obtenha um argumento correto?


Como uma observação lateral, sua string de formato de data pode ser reduzida para "%F %T"se você estiver usando o GNU date.
Jordanm 17/09/15

O problema é o espaço. Se você usar nice_date="date +%Y-%m-%d-%H:%M:%S", ele funciona. Atualmente, não vejo como proteger esse espaço do segundo shell.
MadHatter

Respostas:


13

A razão pela qual seu exemplo falha é devido à maneira como a divisão de palavras do shell funciona. Quando você executa "$($nice_date)", o shell está executando o datecomando com dois argumentos "+%Y-%m-%d"e "%H:%M:%S". Isso falha porque a cadeia de formato da 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 deseja armazenar o comando em uma variável, 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 obter mais detalhes sobre os casos complexos de armazenamento de um comando em uma variável, consulte BashFAQ 050 .


Obrigado, mas estou curioso por que minha abordagem não está funcionando, você pode elaborar isso?
gilbertasm

@gilbertasm resposta atualizada
jordanm

1
Estou recebendo date: extra operand ‘’erros nas duas abordagens acima #
Jeff Puckett

3

Concordo que uma função é o melhor caminho a percorrer. Como alternativa, basta armazenar o formato como uma variável em vez de todo o comando:

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

1
@ Kusalananda: Muito bem. Obrigado! Atualizei a resposta
Adam

E, desculpe, mas a echosubstituição e o comando também são supérfluos.
Kusalananda

1
Sim, eles eram tecnicamente supérfluos no exemplo de corte que eu usei (eu poderia argumentar que eles produzem código mais legível, mas isso é uma questão de gosto). Ter atualizado para usar o exemplo do OP, caso em que eles são necessários
Adam

Sim, esse exemplo faz mais sentido.
Kusalananda

1

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'

1

Uma maneira fácil é apenas "escapar" do espaço com um \

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

0

Por favor, tente o abaixo:

Você precisa adicionar o símbolo "" "o símbolo que está na tecla til no teclado. O símbolo diz ao 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 ~]#

Mesmo problema que a resposta de Iain.
MadHatter

0

Ao invés de:

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

Experimentar:

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"

-1

Teve o mesmo problema; teve que colocar uma data em uma impressão awk para processamento por splunk. eu usei

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

DATE2=`date +%T`

então

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

1
Você pode explicar exatamente como isso responde à pergunta?
G-Man diz 'Restabelecer Monica
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.