do while 루프를 사용하여 Linux에서 특정 값 반환

do while 루프를 사용하여 Linux에서 특정 값 반환

파일이 업데이트되고 있는지 확인하는 스크립트를 작성하려고 합니다. 해당 시점에 파일이 업데이트되는 경우 스크립트는 아무 작업도 수행하지 않지만 파일 업데이트가 중지된 경우 스크립트는 몇 가지 추가 명령문을 반환해야 합니다.

지금까지 다음 스크립트가 있습니다.

#!/bin/bash

DIR=/home/

cd $DIR

FILE=$(find . -maxdepth 1 -type f -mmin -1 -name 'test.log' | wc -l)

while [ ${FILE} -eq 1 ]
do
    echo "Now sleeping for 20 seconds"
    sleep 20
done
if [ ${FILE} -eq 0 ]
then
    echo "Job is finished"
fi

기본적으로 내 홈 디렉토리에서 1분 이내에 업데이트된 test.log라는 파일을 찾고 있습니다. 파일이 존재한다는 것을 보여주기 위해 wc -l을 사용하고 있습니다. test.log 파일이 존재하는 경우 while 루프를 사용하여 "이제 20초 동안 절전 모드로 전환"이라는 문을 반환하고 싶습니다. 파일이 더 이상 업데이트되지 않으면 스크립트를 계속 진행하여 "작업 완료"를 반환하고 싶습니다.

이때 test.log 파일이 없을 때 스크립트를 실행하면 Job is done을 반환하게 된다. 그러나 test.log 파일이 존재하고 "1분 전" 이하인 경우 스크립트는 "현재 20초 동안 대기 중"을 반환하고, 파일이 1분보다 오래되었고 업데이트되지 않은 경우에도 이 정보를 계속 반환합니다. 더 이상. 스크립트가 계속 "작업 완료"를 반환하지 않습니다.

답변1

루프 내에서 변수를 수정하지 않으므로 FILE(동일하게 유지됨) 즉시 완료되거나 무한 루프에 들어갑니다.

귀하의 Linux 시스템에 이 stat명령이 있다고 가정하고, 다음을 시도해 보십시오.

while (( ( $(printf "%(%s)T") - $(stat -c"%Y" test.log) ) < 60 ))
  do    echo "Now sleeping for 20 seconds"
        sleep 20
  done

두 개의 시간 값을 쉽게 빼기 위해 합계 및 에포크 형식 bash의 기능을 활용합니다 . 파일이 1분 내에 변경되면 파일이 1분보다 오래될 때까지 계속 반복됩니다.%()T((...))stat

답변2

영원히 반복되는 while 루프와 break파일을 찾을 수 없는 경우 루프를 사용할 수 있습니다. find중복 검사를 위해 루프 내에서 명령을 이동 해야 합니다 .

#!/bin/bash

while true; do
    logfile=$(find /home -maxdepth 1 -type f -mmin -1 -name 'test.log')

    if [ -z "$logfile" ]; then
      break # no file found, break while-loop
    fi
    echo "Now sleeping for 20 seconds"
    sleep 20
done
echo "Job is finished"

답변3

FILE=$(find . -maxdepth 1 -type f -mmin -1 -name 'test.log' | wc -l)

find할당이 이루어지면 여기에서 명령 대체가 확장되어 시작됩니다. 다른 것은 변경하지 않으므로 FILE스크립트 시작 시 얻은 값이 유지됩니다. 루프 내에서 명령 대체 및 할당을 이동합니다.

답변4

@Freddy의 솔루션을 약간 개선했습니다.

#!/bin/bash

while find /home -maxdepth 1 -type f -mmin -1 -name 'test.log' | grep -q .
do
    echo "Now sleeping for 20 seconds"
    sleep 20
done
echo "Job is finished"

이 솔루션은 greps -q스위치를 사용하여 grep의 일반적인 출력( findnull/not-null 조건 테스트의 출력)을 억제합니다. 명령이 최소한 한 줄의 텍스트를 출력하는 while한 루프는 계속 반복됩니다. 파일이 1분보다 오래되면 find더 이상 출력이 생성되지 않고 명령이 실패하여 루프가 종료됩니다.test.logfindgrep

관련 정보