116

私は現在、bashテストフレームワークを作成しています。テスト関数では、標準のbashテスト([[)と事前定義されたマッチャーの両方を使用できます。マッチャーは'[['のラッパーであり、戻りコードを返すだけでなく、予期されたことを示す意味のあるメッセージを設定します。

例:

string_equals() {
    if [[ ! $1 = $2 ]]; then
            error_message="Expected '$1' to be '$2'."

            return 1
    fi
}

したがって、マッチャーが使用されて失敗した場合にのみ、error_messageが設定されます。

さて、ある時点で、テストが成功したかどうかをテストします。成功した場合は、期待値を緑で印刷し、失敗した場合は赤で印刷します。

さらに、error_messageが設定されている可能性があるため、メッセージが存在するかどうかをテストし、印刷してから設定を解除します(次のテストでは設定されない可能性があるためerror_message)。

if [[ $error_message ]]; then
    printf '%s\n' "$error_message"

    unset -v error_message
fi

さて、私の質問は、変数の設定を解除する方がよいのか、それとも単に''に設定する方がよいのかということです。

error_message=''

どちらがいいですか?それは実際に違いを生むのでしょうか?または、メッセージが設定されたことを示す追加のフラグが必要ですか?

4

4 に答える 4

148

以下を使用しない限り、ほとんどの場合、違いはわかりませんset -u

/home/user1> var=""
/home/user1> echo $var

/home/user1> set -u
/home/user1> echo $var

/home/user1> unset var
/home/user1> echo $var
-bash: var: unbound variable

実際には、変数をどのようにテストするかによって異なります。

設定されているかどうかをテストする私の好みの方法は次のとおりです。

[[ -n $var ]]  # True if the length of $var is non-zero

また

[[ -z $var ]]  # True if zero length
于 2012-09-04T12:54:07.617 に答える
19

言われているように、 unset の使用は配列でも異なります

$ foo=(4 5 6)

$ foo[2]=

$ echo ${#foo[*]}
3

$ unset foo[2]

$ echo ${#foo[*]}
2
于 2014-10-18T16:52:01.230 に答える