2016-12-15 19 views
2

我正在解決這個「遞歸中的因子函數(=獲取n!參數n)」問題。這是我想出的bash shell腳本代碼。我給一個整數作爲參數:Shell腳本的返回值在(正常與調試模式)執行中不同

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

的問題是,當我使用1〜5的終端,因爲它需要的一個參數上運行它(例如./RecFact.sh 5),則返回的值(像5個120)是正確的。

但是,當參數高於5時,它會全部錯誤(例如,對於6,而不是720)。

真奇怪的是,如果我在調試模式下運行它(例如sh -x ./RecFact.sh 6),調試器會爲每個輸入值提供正確的值(如6)。

可能是什麼原因?

+0

在腳本的開頭添加'set -x'並以通常的方式運行腳本以查看腳本的調試運行是一種很好的做法。 – Inian

回答

2

錯誤代碼(您檢查$?)的範圍是0-255。事實上,720模256給你208.

而不是濫用$?您應該使用專用變量來傳達結果。

+0

'^'爲一個優秀的捕獲!你怎麼知道的! – Inian

+0

有很好的文檔說明'return'命令僅用於返回單個字節作爲函數的退出代碼,不返回數據。在通常的編程意義上,shell函數確實不是一個函數。 – chepner

1

在正常模式下,即當您正在執行./RecFact.sh 6你實際上是在執行

慶典RecFact.sh 6

因爲

在你的腳本,你必須#!/bin/bash

但在調試模式下

sh -x ./RecFact.sh 6

您正在使用sh執行。在我的系統上sh有鏈接到破折號。您的系統中也可能出現這種情況。

慶典破折號是兩個不同的貝殼,大多數命令的工作方式相同,但它們是不同的。因此你會看到兩個不同的輸出。

因此,在您的腳本中,如果將#!/bin/bash更改爲#!/bin/sh,它將正常工作。 另外@employee的月份是正確的。不要濫用$?

相關問題