bash: if / elif / fi 未正确评估

bash: if / elif / fi 未正确评估

我有一个脚本可以检查三个目录中的特定 PNG 文件。第一个是本地的,首先被检查。第二个是远程共享,仅当文件在本地硬盘上不可用时才会检查。在某些情况下,第三个目录(存档目录)会递归搜索文件。

由于某些原因,我的 if / elif / fi 构造的第二部分不起作用。我根本不明白为什么找不到 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 ]测试替换为[ -e file ].

相关内容