/ / Il valore di ritorno dello script Shell è diverso nell'esecuzione (modalità normale contro debug) - linux, bash, shell

Il valore di ritorno dello script Shell è diverso nell'esecuzione (modalità normale contro debug) - linux, bash, shell

Stavo risolvendo questa "funzione fattoriale nel problema ricorsivo (= ottenendo n! Di argomento n)". Questo è il codice di script della shell bash che ho trovato. Dò un intero come argomento:

#!/bin/bash
# Script name: RecFact.sh
#
# recursive factorial
factorial(){
if [ $1 -eq 0 ]; then
return 1
fi
pro=`expr $pro * $1`
factorial `expr $1 - 1`
return $pro
}
pro=1
factorial $1
echo "$?"

Il problema è che quando lo eseguo sul terminale con 1 ~ 5 come argomento di cui ha bisogno (ad esempio ./RecFact.sh 5), il valore restituito (come 120 per 5) è corretto.

Ma quando l'argomento va sopra 5, diventa tutto sbagliato (come 208 per 6, invece di 720).

Ciò che è veramente strano è che, se lo eseguo in modalità di debug (ad esempio sh -x ./RecFact.sh 6), il debugger fornisce il valore corretto (come 720 per 6) per ogni valore di input.

Quale potrebbe essere la ragione?

risposte:

2 per risposta № 1

Il codice di errore (che controlli con $?) È compreso nell'intervallo 0-255. E infatti, 720 modulo 256 ti dà 208.

Invece di abusare di $? dovresti usare una variabile dedicata per trasmettere il risultato.


1 per risposta № 2

In modalità normale, cioè quando stai eseguendo ./RecFact.sh 6 in realtà stai eseguendo

bash RecFact.sh 6

dal momento che nel tuo copione hai #!/bin/bash

Ma in modalità di debug

sh -x ./RecFact.sh 6

stai eseguendo usando sh. Sul mio sistema sh ha un link a trattino. Questo potrebbe essere anche nel tuo sistema.

bash e trattino sono due shell differenti, la maggior parte dei comandi funzionano allo stesso modo, ma sono diversi. Quindi stai vedendo due output diversi.

Quindi nella tua sceneggiatura se cambi #!/bin/bash a #!/bin/sh , funzionerà bene. Anche @impiegato del mese è corretta. Non abusare di $?