bash:if / elif / fiが正しく評価されていません。

bash:if / elif / fiが正しく評価されていません。

特定のPNGファイルに対して3つのディレクトリを確認するスクリプトがあります。最初はローカルで、最初に確認されます。 2つ目は、ローカルハードドライブでファイルが利用できない場合にのみ確認されるリモート共有です。場合によっては、3番目のディレクトリ(アーカイブディレクトリ)からファイルを繰り返し検索します。

何らかの理由で、私のif / elif / fi設定の2番目の部分は機能しません。 PNGファイルが間違いなく利用可能であるにもかかわらず、なぜPNGファイルが見つからないのかわかりません。オタとすべての変数を再確認し、そこにログステートメントを追加しました。最後の試みは、より多くのログメッセージを得るために「ファイル」と「0バイトより大きい」評価を分離することでした。ファイルを手動で検索すると(検索またはファイルマネージャを使用して)すぐに検索できますが、スクリプトでは見つかりません。

しかし、最初と3番目の部分はうまく機能します。私はちょっと問題があり、私のスクリプトがファイルを見つけることができない理由がわかりません。誰でも私を助けることができますか?

これは私のコードです。

#!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 ]

関連情報