Perché dovresti preoccuparti di quello che dico nonostante ci sia una risposta di oltre 250 voti positivi
Non è quello 0 = true
e 1 = false
. È: zero significa nessun fallimento (successo) e diverso da zero significa fallimento (di tipo N) .
Mentre la risposta selezionata è tecnicamente "vera" , non inserire return 1
** nel codice per falso . Avrà diversi effetti collaterali sfortunati.
- Gli sviluppatori esperti ti vedranno come un dilettante (per il motivo di seguito).
- Gli sviluppatori esperti non lo fanno (per tutti i motivi di seguito).
- È soggetto a errori.
- Anche gli sviluppatori esperti possono scambiare 0 e 1 rispettivamente come falso e vero (per il motivo sopra).
- Richiede (o incoraggerà) commenti estranei e ridicoli.
- In realtà è meno utile degli stati di restituzione impliciti.
Impara un po 'di bash
Il manuale di bash dice (enfasi sul mio)
return [n]
Provoca l'interruzione dell'esecuzione di una funzione shell e restituisce il valore n al suo chiamante. Se n non viene fornito , il valore restituito è lo stato di uscita dell'ultimo comando eseguito nella funzione.
Pertanto, non dobbiamo MAI usare 0 e 1 per indicare Vero e Falso. Il fatto che lo facciano è essenzialmente una conoscenza banale utile solo per il debug del codice, le domande per le interviste e per far esplodere le menti dei neofiti.
Il manuale di Bash dice anche
altrimenti lo stato di ritorno della funzione è lo stato di uscita dell'ultimo comando eseguito
Il manuale di Bash dice anche
( $? ) Si espande allo stato di uscita dell'ultima pipeline in primo piano eseguita .
Whoa, aspetta. Tubatura? Passiamo al manuale di bash ancora una volta.
Una pipeline è una sequenza di uno o più comandi separati da uno degli operatori di controllo '|' o '| &'.
Sì. Hanno detto che 1 comando è una pipeline. Pertanto, tutte e 3 queste citazioni dicono la stessa cosa.
$?
ti dice cosa è successo per ultimo.
- Bolle.
La mia risposta
Quindi, mentre @Kambus ha dimostrato che con una funzione così semplice, non return
è necessario affatto. Penso che sia stato irrealisticamente semplice rispetto alle esigenze della maggior parte delle persone che leggeranno questo.
Perché return
?
Se una funzione restituisce lo stato di uscita dell'ultimo comando, perché utilizzarla return
? Perché provoca l'esecuzione di una funzione.
Interrompere l'esecuzione in più condizioni
01 function i_should(){
02 uname="$(uname -a)"
03
04 [[ "$uname" =~ Darwin ]] && return
05
06 if [[ "$uname" =~ Ubuntu ]]; then
07 release="$(lsb_release -a)"
08 [[ "$release" =~ LTS ]]
09 return
10 fi
11
12 false
13 }
14
15 function do_it(){
16 echo "Hello, old friend."
17 }
18
19 if i_should; then
20 do_it
21 fi
Quello che abbiamo qui è ...
La linea 04
è un ritorno esplicito [-ish] vero perché l'RHS di &&
viene eseguito solo se l'LHS era vero
La linea 09
restituisce vero o falso corrispondente allo stato della linea08
La riga 13
restituisce false a causa della riga12
(Sì, questo può essere risolto, ma l'intero esempio è inventato.)
Un altro modello comune
# Instead of doing this...
some_command
if [[ $? -eq 1 ]]; then
echo "some_command failed"
fi
# Do this...
some_command
status=$?
if ! $(exit $status); then
echo "some_command failed"
fi
Notare come l'impostazione di una status
variabile demistifica il significato di $?
. (Ovviamente sai cosa $?
significa, ma qualcuno meno esperto di quello che dovresti fare a Google un giorno. A meno che il tuo codice non stia facendo trading ad alta frequenza, mostra un po 'di amore , imposta la variabile.) Ma il vero take-away è che "se non esiste lo stato "o viceversa" se lo stato di uscita "può essere letto ad alta voce e spiegare il loro significato. Tuttavia, l' ultimo potrebbe essere un po 'troppo ambizioso perché vedere la parola exit
potrebbe farti pensare che stia uscendo dallo script, quando in realtà sta uscendo dalla $(...)
subshell.
** Se insisti assolutamente sull'uso return 1
di false, ti suggerisco almeno di usarlo return 255
invece. Ciò causerà il tuo sé futuro o qualsiasi altro sviluppatore che deve mantenere il codice per mettere in dubbio "perché è 255?" Quindi almeno presteranno attenzione e avranno maggiori possibilità di evitare un errore.
function
parola chiave,myfun() {...}
basta