디렉토리에 12개의 파일이 있는지 확인해야 합니다. 이 루프는 파일이 하나만 있을 때 잘 작동하며 "sleep 300"을 사용하여 4번 반복됩니다. 그러나 파일이 전혀 없으면 실패하고 반복되지 않습니다. 파일이 전혀 없더라도 반복되도록 하려면 또 무엇을 추가할 수 있습니까? 간단히 말해서 20분의 파일 전송 시간을 확인하고 싶습니다.
retry() {
attempt_num=0
while [[ `ls -1 *File*${JulianDate}.* | wc -l` -lt 12 ]]
do
답변1
ls
출력을 구문 분석하지 않습니다.. 파일 목록을 배열로 읽고 배열의 크기를 확인합니다.
retry() {
while true; do
files=( *File*${JulianDate}.* )
(( ${#files[@]} >= 12 )) && break
sleep for some amount
done
do stuff with 12 or more files ...
}
답변2
waitforfiles () {
n=0
while [ "$n" -lt 4 ]; do
set -- *File*$JulianDate.*
[ "$#" -ge 12 ] && return 0
sleep 300
n=$(( n + 1 ))
done
return 1
}
if ! waitforfiles; then
echo 'Not enough files arrived in time.' >&2
exit 1
fi
# Do something here.
출력을 구문 분석하지 마십시오 ls
. 구문 분석은 귀하만 수행할 수 있습니다.바라보다존재하다. 대신 셸을 사용하여 일치시키려는 이름을 일치시킨 다음 일치하는 파일 수를 계산하십시오. 셸은 이 기능을 거의 무료로 제공합니다(외부 유틸리티 ls
및 wc
.
위의 함수는 300초 동안 대기한 다음 패턴이 12개 이상의 파일 이름과 일치하거나 루프가 4번 실행될 때까지 다시 시도합니다. 파일이 제 시간에 도착했는지 여부에 따라 성공(0) 또는 실패(0이 아님)를 반환합니다.
관련된: