전역 변수가 있습니다 $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"
- 파싱되지 않음
ls
- ALL_CAPS_VAR_NAMES를 사용하지 마세요.
- 항상 당신을 인용
"$variables"
- Bash에서 변수에 추가
+=