A comparação de data de época de Bash não funciona [duplicado]

1

Precisa de ajuda para corrigir o script bash simples abaixo. O que ele faz é comparar datas no formato de época usando if else. O script não funciona como eu pretendia porque ele sempre vai para a primeira condição DEPLOY o tempo todo.

Mesmo se eu definir a variável deploymentDate para ser maior que currentDate, ela ainda vai para a primeira condição.

Alguém pode sugerir como corrigi-lo?

#!/bin/bash 
currentDate=$(date +s% ) 
deploymentDate=1513516201 

if [ "$currentDate" > "$deploymentDate" ] 
then 
    XSL="DEPLOY" 
else 
    XSL="DO NOT DEPLOY" 
fi 
echo $XSL 

Saída

DEPLOY
    
por dimas 18.12.2017 / 05:32

1 resposta

2

uso incorreto da data.

  • date +%s com GNU date ou compatível ou
  • awk 'BEGIN{srand(); printf "%lu\n", srand()}' com a maioria das implementações de awk (será garantido pela próxima versão da especificação POSIX)

uso errado da declaração:

  • if ((currentDate > deploymentDate)) ( ksh / zsh / bash )
  • if [ "$currentDate" -gt "$deploymentDate" ] (POSIX)

Como alternativa, você pode usar as datas UTC no formato AAAA-mm-dd HH: MM: SS e usar a comparação lexical:

currentDate=$(date -u +'%Y-%m-%d %T') 
deploymentDate='2017-12-17 13:10:01' # UTC
if [[ "$currentDate" > "$deploymentDate" ]] # ksh/bash/zsh

if expr "$currentDate" '>' "$deploymentDate" > /dev/null # POSIX

Ou comparação numérica com formatos de data YYYYmmddHHMMSS, mas você pode encontrar problemas em sistemas ou shells (como mksh ) usando números inteiros de 32 bits para aritmética.

    
por 18.12.2017 / 05:39