Wiem, że w tym są wartości boolowskie bash
, ale nigdzie ich nie widzę.
Chcę napisać opakowanie na niektóre często wyszukiwane informacje na moim komputerze, na przykład czy ten konkretny dysk USB jest włożony / zamontowany.
Jaka byłaby najlepsza praktyka, aby to osiągnąć?
Sznurek?
drive_xyz_available=true
Liczba (0 dla wartości true, ≠ 0 dla wartości false)?
drive_xyz_available=0 # evaluates to true
Funkcja?
drive_xyz_available() { if available_magic; then return 0 else return 1 fi }
Zastanawiam się głównie, czego mogą oczekiwać inni ludzie, którzy chcieliby korzystać z opakowania. Czy spodziewaliby się wartości logicznej, polecenia podobnego do zmiennej lub funkcji do wywołania?
Z punktu widzenia bezpieczeństwa uważam, że druga opcja jest najbezpieczniejsza, ale chciałbym usłyszeć twoje doświadczenia.
shell
shell-script
Minix
źródło
źródło
help true ; help false ; help exit
Odpowiedzi:
Po prostu ustaw zmienną na cokolwiek, ale nie na zero, aby powyższe działało, choć
[ -n "$var" ]
byłoby krótsze, jeśli nie tak oczywiste.Zasadniczo, gdy skrypt interpretuje zmienną środowiskową jako prawdę lub fałsz, zinterpretuje dowolną wartość jako prawdę (i czasami używa tej wartości do skonfigurowania jakiejś opcji) lub wartość zerową jako fałsz.
Powyższe zwraca
!not
wartość logiczną len pierwszego argumentu - jeśli argument zawiera dowolną liczbę znaków innych niż 0, zwraca 0, w przeciwnym razie, jeśli nie ma żadnych znaków, zwraca 1. Jest to ten sam test, który można wykonać[ -n "$var" ]
, zasadniczo , ale po prostu otacza go małą funkcją o nazwiebool()
.Tak zazwyczaj działa zmienna flagowa . Na przykład:
Tam, gdzie inne części skryptu potrzebują tylko jakiejkolwiek wartości,
$dir
aby ocenić jej przydatność. Jest to również przydatne, gdy chodzi o zastępowanie parametrów - ponieważ parametry można rozszerzyć do wartości domyślnych, aby wypełnić je pustymi lub nieuzbrojonymi, ale w przeciwnym razie zostaną rozszerzone do wstępnie ustawionej wartości, takiej jak ...... który wydrukowałby ...
Oczywiście możliwe jest również odwrotne działanie,
:+
ale może to dać tylko domyślną wartość domyślną lub w ogóle nic, podczas gdy powyższa forma może dać wartość lub wartość domyślną.I tak w odniesieniu do trzech opcji - każda może działać w zależności od tego, jak zdecydujesz się ją wdrożyć. Zwrotem funkcji jest autotest, ale jeśli zwrot ten wymaga zapisania z jakiegokolwiek powodu, należy go umieścić w zmiennej. Zależy to od przypadku użycia - czy wartość logiczna ma być oceniana raz, a typ wykonania? Jeśli tak, wykonaj tę funkcję, w przeciwnym razie prawdopodobnie konieczne będzie jedno z dwóch pozostałych.
źródło
true
lubfalse
do zmiennej, którą możesz zrobićif $variable; then ...
$IFS
- i jeśli wartość var może zawierać dane wejściowe użytkownika, to również powodzenia. Jeśli wartość nie jest nieznana na początku, wówczas nie ma potrzeby jej testowania. Bezpieczniej możesz to zrobićif ${var:+":"} false; then
, pracując z wartościami logicznymi null / not null. Ale to rzadko jest bardziej przydatne niż[ -n "$var" ] &&
variable=false
a następnie ustawię go na true zgodnie z dowolnym warunkiem (tak jak zrobiłbym to przy użyciu zmiennej w C), to nie będzie żadnego problemu, jaka jest twoja obsesja na punkcie zmieniania wartości IFS i losowych wartości zmiennych itp. ,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 [ ... ]
lubif [[ ]]
lubif 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
afalse
programy (zwykle zastępowane przez wbudowane) są po prostu przydatnymi małymi programami, które nic nie robią - nietrue
robią nic i wychodzą z 0, podczas gdyfalse
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 prostuexit
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ćjeśli testujesz istnienie węzła urządzenia (lub grep,
/proc/mounts
aby sprawdzić, czy jest on zamontowany?).źródło
drive_xyz_available()
najczęstszą?y = true
przypadku? Z mojego doświadczenia wynika, że większość skryptów opakowania sprawdza, czy nie ma wartości zerowej, aby uznać ją za prawdziwą - przynajmniej jeśli chodzi o interpretowane zmienne środowiskowe. W przeciwnym razie całkowicie ignorują samochody pancerne.if
testu nie jest konieczna, jeśli zmienna jest cytowana;if [ "$variable" = "yes" ]
działa dobrze, nawet jeśli zmienna $ nie jest ustawiona.Zasadniczo każda liczba, która nie jest zerem, jest prawdą, a 0 jest fałszem. Powód zwrócenia wartości jako 0 dla pomyślnego zakończenia skryptu lub dowolnej innej liczby w celu identyfikacji różnego rodzaju błędów.
$?
zwróci kod zakończenia poprzedniej komendy / pliku wykonywalnego, będący 0 sukcesem, a każdą inną liczbą zwrócony błąd.Więc użyłbym tej metody dla true / false.
if (( ! $? ));then OK;else NOOK;fi
źródło
true; echo $?
ifalse; echo $?
.!
wyniku, aby był PRAWDA. Wynik polecenia wynosi 0, gdy poprawnie się zakończy, co nie oznacza, że 0 jest prawdziwe. Słowotrue
może mieć wartość 0, ale 0 nigdy nie jest prawdą, jakif
pokazuje warunek.0
totrue
dlatego, żeif(!x){True();}else{False();}
zadzwoniTrue()
pox==0
. Ale poprawna kontrola nie byłaby!x
, ale raczej!!x
.if
prostu stwierdzam, że tutaj (w bash, ksh, tsh, lub ....) jak w C / C ++ a 0 jest FAŁSZ, dowolny inna liczba to PRAWDA, jak można przeczytać w poniższym linku, początkowe implementacje języka C nie zapewniały typu logicznego, zdefiniowane jako ints, gdzie 0 to FAŁSZ, a 1 PRAWDA en.wikipedia.org/wiki/Boolean_data_type .