In bash
ogni variabile è essenzialmente una stringa (o una matrice o una funzione, ma parliamo di variabili regolari qui).
Le condizioni vengono analizzate in base ai valori restituiti dai comandi di test: il valore restituito non è una variabile, è uno stato di uscita. Quando valuti if [ ... ]
o if [[ ]]
o if grep something
qualcosa del genere, il valore restituito 0 (non la stringa 0, ma lo stato di uscita 0 = successo) significa vero e il resto significa falso (quindi esattamente il contrario di quello a cui sei abituato nei linguaggi di programmazione compilati, ma poiché esiste un modo per avere successo e molti modi per fallire e il risultato previsto dell'esecuzione è in genere un successo, 0 viene utilizzato come risultato predefinito più comune se nulla va storto). Questo è molto utile perché qualsiasi binario può essere usato come test - se fallisce, è falso, altrimenti è vero.
true
e i false
programmi (di solito sovrascritti dai builtin) sono solo piccoli programmi utili che non fanno nulla: non true
riescono a fare nulla ed escono con 0, mentre false
tentano di non fare nulla e "falliscono", uscendo con 1. Sembra inutile ma è molto utile per gli script.
Quanto a come passare la veridicità in giro, dipende da te. È abbastanza comune usare solo "y" o "yes" per la verità e l'uso if [ x"$variable" = x"yes" ]
(ha aggiunto la stringa fittizia x
perché se $variable
sembra essere di lunghezza zero, questo protegge dalla creazione di un comando fasullo if [ = "yes" ]
che non analizza). Potrebbe anche essere utile utilizzare semplicemente una stringa vuota per false e utilizzare [ -z "$variable ]
per verificare se è di lunghezza zero (o -n
se deve essere diversa da zero).
Ad ogni modo, è abbastanza raro dover effettivamente passare valori booleani in bash
- è molto più comune semplicemente exit
in caso di fallimento o restituire un risultato utile (o zero se qualcosa va storto e testare una stringa vuota), e la maggior parte dei casi può verifica guasti direttamente dallo stato di uscita.
Nel tuo caso, vuoi una funzione che fungerà da qualsiasi altro comando (quindi, restituisce 0 in caso di successo), quindi la tua ultima opzione sembra la scelta giusta.
Inoltre, potresti non aver nemmeno bisogno di return
dichiarazioni. Se la funzione è abbastanza semplice, è possibile utilizzare il fatto che restituisce semplicemente lo stato dell'ultimo comando eseguito nella funzione. Quindi la tua funzione può essere semplicemente
drive_xyz_available() {
[ -e /dev/disk/by-uuid/whatever ]
}
se si sta verificando l'esistenza di un nodo del dispositivo (o grep /proc/mounts
per verificare se è montato?).
help true ; help false ; help exit