/ / Wartość zwracana skryptu powłoki jest inna w trybie (normalne vs debugowanie) - linux, bash, shell

Wartość zwracana skryptu Shell różni się w trybie normalnym od debugowania - linux, bash, shell

Rozwiązałem tę "funkcję czynnikową w rekurencyjnym (= uzyskanie n! Argumentu n)" problem. To jest kod skryptu powłoki bash, który wymyśliłem. Daję jedną liczbę całkowitą jako argument:

#!/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 "$?"

Problem polega na tym, że gdy uruchomię go na terminalu z 1 ~ 5 jako jedynym argumentem, którego potrzebuje (np. / RecFact.sh 5), zwrócona wartość (jak 120 dla 5) jest poprawna.

Ale kiedy argument przekracza 5, robi się źle (jak 208 zamiast 620 zamiast 720).

Co jest naprawdę dziwne, jeśli uruchomię go w trybie debugowania (np. Sh -x ./RecFact.sh 6), debugger podaje poprawną wartość (np. 720 dla 6) dla każdej wartości wejściowej.

Jaki mógł być powód?

Odpowiedzi:

2 dla odpowiedzi № 1

Kod błędu (który sprawdzasz za pomocą $?) Zawiera się w przedziale 0-255. I rzeczywiście, 720 modulo 256 daje ci 208.

Zamiast nadużywać $? powinieneś użyć specjalnej zmiennej, aby przekazać wynik.


1 dla odpowiedzi nr 2

W trybie normalnym, np. Podczas wykonywania ./RecFact.sh 6 faktycznie wykonujesz

bash RecFact.sh 6

ponieważ masz w swoim skrypcie #!/bin/bash

Ale w trybie debugowania

sh -x ./RecFact.sh 6

wykonujesz przy użyciu sh. W moim systemie sh ma link do dziarskość. Tak może być również w twoim systemie.

grzmotnąć i dziarskość są dwiema różnymi powłokami, większość poleceń działa tak samo, ale są różne. Dlatego widzisz dwa różne wyjścia.

Więc w swoim skrypcie, jeśli się zmienisz #!/bin/bash do #!/bin/sh , zadziała dobrze. Również @pracownik miesiąca jest poprawne. Nie nadużywaj $?