루프 내부의 전역 변수에 연결하시겠습니까? [복사]

루프 내부의 전역 변수에 연결하시겠습니까? [복사]

전역 변수가 있습니다 $EMAIL. 여러 파일을 반복하면서 조건을 충족하는 각 파일에 대해 추가하여 $EMAIL보고서를 생성하려고 합니다.

문제는 $EMAIL루프 내에서 재정의 하면 $EMAIL루프 반복 범위 내에서만 변경된다는 것입니다. 글로벌 버전은 $EMAIL아직 비어 있습니다.

내 프로그램의 단순화된 버전은 다음과 같습니다.

#!/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

$EMAIL루프 내부에서 추가 할 수 있도록 스크립트를 어떻게 수정합니까 ?


편집/업데이트

이 예를 더 단순화하고 싶었기 때문에 변경해 보았습니다.

ls | while read line; do

도착하다:

for i in {1..2}; do

nope이 변경 사항이 에 추가되는 것이 이상합니다 $EMAIL. 여기서 무엇이 잘못되었는지 제가 오해한 것일까요?

답변1

존재하다:

cmd1 | cmd2

bash하위 쉘에서 실행되므로 cmd2변수 변경은 상위 쉘에 표시되지 않습니다.

넌 할 수있어:

#!/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"

또는 동일한 쉘 프로세스에서 실행 되는 zsh또는 ksh를 사용하십시오.cmd2

답변2

@cuonglm이 귀하의 질문에 대한 답변을 제공합니다. 그러나 당신의질문구문 분석 중인 출력입니다 ls. 다음을 수행해야 합니다.

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"

관련 정보