W bash
każdej zmiennej jest zasadniczo ciąg (lub tablica lub funkcja, ale porozmawiajmy tutaj o zmiennych regularnych).
Warunki są analizowane na podstawie zwracanych wartości poleceń testowych - zwracana wartość nie jest zmienną, lecz stanem wyjścia. Podczas oceny if [ ... ]
lub if [[ ]]
lub if grep something
lub coś podobnego, zwracana wartość 0 (nie łańcuch 0, ale stan exit 0 = sukces) oznacza prawdę, a reszta średnia false (tak, dokładnie odwrotnie od czego są wykorzystywane w skompilowanych języków programowania, ale ponieważ istnieje jeden sposób na sukces i wiele sposobów na niepowodzenie, a oczekiwanym rezultatem wykonania jest zwykle sukces, 0 jest używane jako najczęstszy domyślny wynik, jeśli nic nie pójdzie źle. Jest to bardzo przydatne, ponieważ każdy plik binarny może być użyty jako test - jeśli zawiedzie, jest fałszywy, w przeciwnym razie jest prawdziwy.
true
a false
programy (zwykle zastępowane przez wbudowane) są po prostu przydatnymi małymi programami, które nic nie robią - nie true
robią nic i wychodzą z 0, podczas gdy false
próbują nic nie robić i „kończą się niepowodzeniem”, wychodząc z 1. Brzmi bez sensu, ale jest bardzo przydatne do pisania skryptów.
To, jak przekazać prawdę, zależy od ciebie. Dosyć często używa się po prostu „y” lub „tak” dla prawdy i użycia if [ x"$variable" = x"yes" ]
(dołączono fikcyjny ciąg, x
ponieważ jeśli $variable
ma zerową długość, chroni to przed tworzeniem fałszywego polecenia, if [ = "yes" ]
które nie analizuje). Przydatne może być również użycie pustego ciągu dla false i użycie go [ -z "$variable ]
do sprawdzenia, czy ma zerową długość (lub -n
żeby nie był zerowy).
W każdym razie dość rzadko trzeba przekazywać wartości boolowskie bash
- o wiele bardziej powszechne jest po prostu exit
niepowodzenie lub zwracanie użytecznego wyniku (lub zero, jeśli coś pójdzie nie tak i testowanie pustego ciągu), a większość przypadków może test na awarię bezpośrednio ze statusu wyjścia.
W twoim przypadku potrzebujesz funkcji, która będzie działać jak każde inne polecenie (dlatego zwróci 0 po sukcesie), więc twoja ostatnia opcja wydaje się właściwym wyborem.
Ponadto może nie być potrzebne return
oświadczenie. Jeśli funkcja jest wystarczająco prosta, możesz użyć faktu, że po prostu zwraca status ostatnio wykonanego polecenia w funkcji. Twoja funkcja może po prostu być
drive_xyz_available() {
[ -e /dev/disk/by-uuid/whatever ]
}
jeśli testujesz istnienie węzła urządzenia (lub grep, /proc/mounts
aby sprawdzić, czy jest on zamontowany?).
help true ; help false ; help exit