bash: if/elif/fi가 올바르게 평가되지 않았습니다.

bash: if/elif/fi가 올바르게 평가되지 않았습니다.

특정 PNG 파일에 대해 세 개의 디렉터리를 확인하는 스크립트가 있습니다. 첫 번째는 로컬이며 먼저 확인됩니다. 두 번째는 로컬 하드 드라이브에서 파일을 사용할 수 없는 경우에만 확인되는 원격 공유입니다. 어떤 경우에는 세 번째 디렉터리(아카이브 디렉터리)에서 파일을 반복적으로 검색합니다.

어떤 이유로 내 if / elif / fi 구성의 두 번째 부분이 작동하지 않습니다. PNG 파일이 확실히 사용 가능함에도 불구하고 왜 PNG 파일을 찾을 수 없는지 이해가 되지 않습니다. 오타와 모든 변수를 다시 확인하고 여기 저기에 로그 문을 추가했습니다. 마지막 시도는 더 많은 로그 메시지를 얻기 위해 "파일임"과 "0바이트보다 큼" 평가를 분리하는 것이었습니다. 파일을 수동으로 찾을 때(찾기 또는 파일 관리자를 사용하여) 즉시 찾을 수 있지만 스크립트에서는 찾을 수 없습니다.

그러나 첫 번째와 세 번째 부분은 잘 작동합니다. 이제 약간 문제가 발생하여 내 스크립트가 파일을 찾을 수 없는 이유를 모르겠습니다. 누구든지 나를 도와줄 수 있나요?

이것은 내 코드입니다.

#!bin/bash
[...snip...]
find $printjobtemp -type f -maxdepth 1 -iname $printjobsearch | \
while read filename
do
    # check if file is > 0 Bytes
    # skip if 0 bytes, process if larger than 0 bytes
    if [ -s "$filename" ]
    then

        if [ -f "$pngdir/$pngname" ] && [ -s "$pngdir/$pngname" ]
        then
            # png is available & > 0 bytes -> move printjob to printjobdirectory
            writelog "    found $pngname in $pngdir"

            # create a copy for the archive
            fileoperation=`cp -fv $filename $printjobdir/archive/$printjobfile 2>&1`
            writelog "    cp $fileoperation"

            # move printjob to printjobdir
            fileoperation=`mv -fv $filename $printjobdir/$printjobfile 2>&1`
            writelog "    mv $fileoperation"

        # if not in pngdir: check in pngtemp
        elif [ -f "$pngtemp/$pngname" ]
        then
            writelog "    found in $pngtemp/$pngname - checking size..."
            if [ -s "$pngtemp/$pngname" ]
            then
            writelog "    found $pngname in $pngtemp and size is >0"

            # move png to pngdir
            fileoperation=`mv -fv $pngtemp/$pngname $pngdir/$pngname  2>&1`
            writelog "    mv $fileoperation"

            # create a copy for the archive
            fileoperation=`cp -fv $filename $printjobdir/archive/$printjobfile  2>&1`
            writelog "    cp $fileoperation"

            # move printjob to printjobdir
            fileoperation=`mv -fv $filename $printjobdir/$printjobfile  2>&1`
            writelog "    mv $fileoperation"
        fi
        # png not in pngdir & pngtemp
        # check if it is an old printjob (reprint) and search in pngarchive
        elif [ $pngage -gt $pngthreshold ]
        then
            writelog "    png not found and printjob is considered as \"old\" - checking $pngarchive"
            pngarchivefile=`find $pngarchive -type f -iname $pngname -printf '%p\n' | sort | tail -n 1`
            writelog "    searchresult: $pngarchivefile"

            # check if searchresult contains a value
            if [ -n "$pngarchivefile" ]
            then
                # searchresult is not NULL -> move the png back to $pngdir
                writelog "    moving $pngarchivefile to $pngdir"

                # move png to pngdir
                fileoperation=`mv -fv $pngarchivefile $pngdir/$pngname  2>&1`
                writelog "    mv $fileoperation"

                # create a copy for the archive
                fileoperation=`cp -fv $filename $printjobdir/archive/$printjobfile  2>&1`
                writelog "    cp $fileoperation"

                # move printjob to printjobdir
                fileoperation=`mv -fv $filename $printjobdir/$printjobfile  2>&1`
                writelog "    mv $fileoperation"

            else
                # searchresult is NULL - complain about this and do nothing
                writelog "    $pngname not found in archive - this should be checked manually!"
            fi
        else
            writelog "    $pngname not existing or 0 Bytes - skipping $printjobfile"
            # writelog "    pngtemp: $pngtemp/$pngname"
        fi
    fi
done
[...snap...]

감사합니다,

경질막

답변1

블록이 뒤섞여 있습니다 if...fi. 현재 스크립트 구조는 다음과 같습니다.

if [ -f "$pngdir/$pngname" ] && [ -s "$pngdir/$pngname" ]
then

elif [ -f "$pngtemp/$pngname" ]
then
    if [ -s "$pngtemp/$pngname" ]
    then

    fi
elif [ $pngage -gt $pngthreshold ]
then
    if [ -n "$pngarchivefile" ]
    then

    else

    fi
else

fi
fi

보시다시피 추가 사항이 있습니다 fi. 구문 오류가 발생하지 않으면 최종 결과 fi는 스크립트의 이전 섹션에서 무언가를 끝내는 것이므로 생각한 대로 진행되지 않을 수 있습니다.

또한 [ -f $pngname ]대상이 일반 파일인지 확인하십시오. 단지 그것이 존재하는지 확인하고, 존재한다면 디렉토리나 다른 것이 아닌 파일이어야 한다는 것을 확인하고 싶다면 건너뛰고 -f직접 사용할 수 있습니다 -s. [ -s file ]파일이 존재하지 않으면 false를 반환합니다.

스크립트의 나머지 부분을 표시하지 않기 때문에 스크립트가 실패하는 이유를 정확히 알 수 없습니다. 질문을 편집하고 오류를 재현하는 최소한의 실제 예제를 제공하면 이 답변을 업데이트할 수 있습니다. 또 다른 가능성은 대상 파일이 실제로 링크일 경우이며, 이 경우 [ -f file ]실패합니다. 연결에도 필요한 경우 [ -f file ]test를 로 바꾸십시오 [ -e file ].

관련 정보