Obecnie piszę framework testowy bash, w którym w funkcji testowej [[
można używać zarówno standardowych testów bash ( ), jak i predefiniowanych dopasowań. Dopasowujące są opakowaniami dla '[[' i oprócz zwracania kodu powrotu, ustawiają sensowną wiadomość mówiącą o oczekiwaniach.
Przykład:
string_equals() {
if [[ ! $1 = $2 ]]; then
error_message="Expected '$1' to be '$2'."
return 1
fi
}
Tak więc, gdy zostanie użyty element dopasowujący i nie powiedzie się, tylko wtedy ustawiany jest komunikat o błędzie.
Teraz, w pewnym momencie później, sprawdzam, czy testy się powiodły. Jeśli się udało, drukuję oczekiwanie na zielono, jeśli zawiodło na czerwono.
Ponadto może być ustawiony komunikat error_message, więc sprawdzam, czy komunikat istnieje, drukuję go, a następnie kasuję (ponieważ poniższy test może nie ustawić error_message
):
if [[ $error_message ]]; then
printf '%s\n' "$error_message"
unset -v error_message
fi
Teraz moje pytanie brzmi, czy lepiej jest cofnąć ustawienie zmiennej, czy po prostu ustawić ją na „”, na przykład
error_message=''
Który jest lepszy? Czy to rzeczywiście robi różnicę? A może powinienem mieć dodatkową flagę wskazującą, że komunikat został ustawiony?
error_message
z niczym innym, powiedziałbym, że to nie ma znaczenia. Jednak myślę, że chcesz[[ $error_message ]]
, w przeciwnym razie testujesz, czy istnieje literał „komunikat_błędu”.Odpowiedzi:
Przeważnie nie widzisz różnicy, chyba że używasz
set -u
:Tak naprawdę to zależy od tego, jak zamierzasz przetestować zmienną.
Dodam, że preferowany przeze mnie sposób testowania jeśli jest ustawiony to:
lub
źródło
var=
nie jest „nie ustawiono”. To po prostu niecytowany pusty ciąg. Oprócz tegoset -u
, różne formy rozwijania parametrów przez bash mogą również rozróżniać między wartościami nieustawionymi i zerowymi: gdy foo jest nieustawione lub zerowe,${foo:bar}
rozwija się do „bar”, gdy niefoo
jest ustawione, ale „”, gdyfoo
jest null, a${foo:-bar}
do „bar”.[[ -n $var ]]
ma wartość false, jeślivar
jest ustawiona na pusty ciąg.${foo-bar}
zamiast${foo:bar}
.unset a; echo ">${a:-foo}-${a:foo}-${a-foo}<"
Jak już powiedziano, używanie unset różni się również w przypadku tablic
źródło
Tak więc, usuwając indeks tablicy 2, zasadniczo usuwasz ten element z tablicy i zmniejszasz rozmiar tablicy (?).
Zrobiłem własny test.
Co skutkuje w..
Więc tylko wyjaśnienie, że wyłączenie całej tablicy w rzeczywistości całkowicie ją usunie.
źródło
W oparciu o powyższe komentarze, oto prosty test:
Przykład:
źródło