W bashkaż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 somethinglub 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.
truea falseprogramy (zwykle zastępowane przez wbudowane) są po prostu przydatnymi małymi programami, które nic nie robią - nie truerobią nic i wychodzą z 0, podczas gdy falsepró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, xponieważ jeśli $variablema 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 exitniepowodzenie 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 returnoś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/mountsaby sprawdzić, czy jest on zamontowany?).
help true ; help false ; help exit