Comportamento variável

0

Antes de começar, não estou pedindo que qualquer código seja escrito apenas para esclarecer e o comportamento que estou tendo. Eu tenho esse trecho de código.

NOW=$(date +"%H")
While [ true ]; do
 echo $NOW
done

Eu esperava que, quando fosse impressa na tela, a hora fosse atualizada, pois estou armazenando o comando date e formatando-o na variável NOW, mas tudo o que ele faz é continuar imprimindo a mesma data em que o script foi iniciado em. Alguém me esclarecerá sobre por que isso acontece?

    
por bigbaddevil7 06.09.2016 / 00:10

2 respostas

3

Ele se comporta como deveria. O que você espera, poderia ser alcançado desta forma:

while [ true ]; do
    NOW=$(date +"%H")
    echo $NOW
done

Agora, a variável é atualizada a cada iteração do loop.

Compare os dois com este:

NOW=date

while [ true ]; do
    $NOW
done

A data atual é recalculada em cada iteração, pois o comando em si é armazenado na variável, não no resultado.

    
por 06.09.2016 / 00:16
2

Uma variável recebe um valor quando é atribuída.

Por exemplo

x=1

definirá o valor da variável x para 1. O valor não muda a menos que você atribua um novo valor a ele.

Quando você faz

NOW=$(date +"%H")

o shell executará o comando date e colocará os resultados na variável NOW . Novamente, o valor não muda a menos que você atribua um novo valor. Não importa que date seja um comando externo; é executado uma vez quando a variável recebe o valor.

Então, você precisa atribuir o valor dentro do loop ... ou usar uma função.

NOW()
{
   date +"%H"
}

Isso não define uma variável, mas uma função. Agora você pode usar isso dentro do seu loop

while [ true ]; do
  echo $(NOW)
done

Note que a maneira como você chama é diferente.

Neste caso limitado, podemos simplificar:

while [ true ]; do
  NOW
done

O script final seria

#!/bin/bash

NOW()
{
   date +"%H"
}

while [ true ]; do
  NOW
done
    
por 06.09.2016 / 00:32