Ich schreibe gerade ein Bash-Test-Framework, in dem in einer Testfunktion sowohl Standard-Bash-Tests ( [[
) als auch vordefinierte Matcher verwendet werden können. Matcher sind Wrapper für '[[' und setzen neben der Rückgabe eines Rückkehrcodes eine aussagekräftige Nachricht, die besagt, was erwartet wurde.
Beispiel:
string_equals() {
if [[ ! $1 = $2 ]]; then
error_message="Expected '$1' to be '$2'."
return 1
fi
}
Wenn also ein Matcher verwendet wird und dieser fehlschlägt, wird nur dann eine error_message gesetzt.
Jetzt, irgendwann später, teste ich, ob die Tests erfolgreich waren. Wenn es erfolgreich war, drucke ich die Erwartung in grün, wenn es fehlgeschlagen ist, in rot.
Darüber hinaus ist möglicherweise eine error_message festgelegt, sodass ich teste, ob eine Nachricht vorhanden ist, sie drucke und dann deaktiviere (da der folgende Test möglicherweise keine festlegt error_message
):
if [[ $error_message ]]; then
printf '%s\n' "$error_message"
unset -v error_message
fi
Nun ist meine Frage, ob es besser ist, die Variable zu deaktivieren oder sie einfach auf '' zu setzen, wie
error_message=''
Welches ist besser? Macht es tatsächlich einen Unterschied? Oder sollte ich ein zusätzliches Flag haben, das angibt, dass die Nachricht gesetzt wurde?
error_message
mit etwas anderem vergleichen , würde ich sagen, dass es keine Rolle spielt. Ich denke jedoch, dass Sie möchten[[ $error_message ]]
, andernfalls testen Sie, ob die Literalzeichenfolge "error_message" vorhanden ist.Antworten:
Meistens sehen Sie keinen Unterschied, es sei denn, Sie verwenden
set -u
:Es hängt also wirklich davon ab, wie Sie die Variable testen werden.
Ich werde hinzufügen, dass meine bevorzugte Art zu testen, ob es eingestellt ist, ist:
oder
quelle
var=
ist nicht "nicht gesetzt". Es ist nur eine nicht zitierte leere Zeichenfolge. Darüber hinausset -u
können die verschiedenen Formen der Parametererweiterung von bash auch zwischen nicht gesetzten und null-Werten unterscheiden: Erweitert${foo:bar}
sich auf "bar", wenn nicht gesetztfoo
ist, aber "" wennfoo
ist null, während${foo:-bar}
erweitert auf "bar", wenn foo nicht gesetzt oder null ist.[[ -n $var ]]
ist falsch, wennvar
auf die leere Zeichenfolge gesetzt ist.${foo-bar}
statt sein${foo:bar}
. Testen Sie selbst:unset a; echo ">${a:-foo}-${a:foo}-${a-foo}<"
Wie bereits erwähnt, unterscheidet sich die Verwendung von unset auch bei Arrays
quelle
Wenn Sie also den Array-Index 2 deaktivieren, entfernen Sie im Wesentlichen dieses Element im Array und verringern die Array-Größe (?).
Ich habe meinen eigenen Test gemacht ..
Was in ... endet..
Nur um zu verdeutlichen, dass das Deaktivieren des gesamten Arrays es tatsächlich vollständig entfernt.
quelle
Basierend auf den obigen Kommentaren ist hier ein einfacher Test:
Beispiel:
quelle