Acrescentar à variável global dentro de um loop? [duplicado]

0

Eu tenho uma variável global $EMAIL . Eu quero percorrer vários arquivos e para cada um que atenda a um critério, vou adicioná-lo a $EMAIL para geração de relatórios.

O problema é que ao redefinir $EMAIL dentro do loop, ele só altera $EMAIL no escopo da iteração do loop. A versão global de $EMAIL permanece vazia.

Esta é uma versão simplificada do meu programa:

#!/usr/bin/env bash

EMAIL="I echo without 'nope'"
ls | while read line; do
  if [ 73523 -lt 86400 ]
  then
    echo "Hasn't been backed up in over a day"
    EMAIL="$EMAIL nope"
  fi
done

echo $EMAIL

Como posso modificar meu script para que eu possa adicionar $EMAIL dentro do loop?

Editar / atualizar

Eu queria simplificar ainda mais o exemplo, então tentei mudar

ls | while read line; do

para:

for i in {1..2}; do

Estranhamente, com essa alteração, nope é anexado a $EMAIL , talvez eu esteja entendendo mal o que está errado aqui?

    
por Philip Kirkbride 05.10.2017 / 17:23

2 respostas

2

Em:

cmd1 | cmd2

bash run cmd2 em uma subshell, portanto, alterar a variável não será visível para o shell pai.

Você pode fazer:

#!/usr/bin/env bash

EMAIL="I echo without 'nope'"
while read line; do
  if [ 73523 -lt 86400 ]
  then
    echo "Hasn't been backed up in over a day"
    EMAIL="$EMAIL nope"
  fi
done < <(ls)

echo "$EMAIL"

ou usando zsh ou ksh , que executará cmd2 no mesmo processo de shell.

    
por 05.10.2017 / 17:39
2

@cuonglm tem a resposta para sua pergunta. No entanto, seu problema está analisando a saída de ls . Você deveria fazer isso:

email="..."
for file in *; do
    t=$(calculate_last_backup "$file")
    if some_condition_with "$t"; then
        email+="some text"
    fi
done
do_something_with "$email"
por 05.10.2017 / 18:29

Tags