空のファイルテストが期待どおりに失敗しない

空のファイルテストが期待どおりに失敗しない

結果を返すために、特定の値に基づいて2つのファイルの内容を確認する次のコードスニペットがあります。

if [[ "$(/bin/cat ${TMP_FILE})" != "" ]]
then
    if [[ $(cat ${TMP_FILE}) -gt ${TEST1} ]]
    then
        res=503
        sec=101
    elif [[ $(cat ${TMP_FILE2}) -gt ${TEST2} ]]
    then
        res=503
        sec=102
    else
        res=200
        sec=103
    fi
else
    res=503
    sec=999
fi

デフォルトで$TMP_FILEは空の場合はすぐにジャンプしますsec=999

$TMP_FILE2しかし、空であれば最後までジャンプする結果も得られます。どうしたのか、2部か3部( sec=102or sec=103)で失敗すると予想したから。

ベストアンサー1

ファイルを3回読みました(!)。もちろん、オペレーティングシステムはファイルキャッシュを提供し、状況を悪化させる可能性があります(最悪の場合:読み取り間でファイルが変更されると、スクリプトは3つの異なる内容を読み取ります)。ファイル内容を分岐せずに一度読んだcat後、その内容に対してシェルテストを使用する方が賢明です。

#!/usr/bin/env bash

# look ma no cat!
TMP_FILE_CONTENTS=$(<"$1")

if [[ -n "$TMP_FILE_CONTENTS" ]]; then
    if [[ "$TMP_FILE_CONTENTS" -gt 42 ]]; then
        echo more
    else
        echo less
    fi
else
    echo empty
fi

私にとって、これは次のようなものを生成します

$ :> empty
$ echo 5 > small
$ echo 999999 > big
$ ./reed empty
empty
$ ./reed small
less
$ ./reed big  
more
$ 

おすすめ記事