Linux Shell-Script和Recursion,Variable不保留值

时间:2013-08-20 18:06:58

标签: bash shell recursion

我正在编写一个简单的非Fibonacci序列生成器,其范围使用命令行参数。 我已经实现了Non_Recursive版本,它按预期工作。

以下是非递归版本的代码:

clear
if [ $# -ne 1 ]; then
    echo "Invalid Argument."
    exit
fi

max=$1

a=0
b=1
echo "Non-Fibonacci Numbers :"
lastFib=0
flag=0
for (( i=1; i<=i+1; i++ ))
do
    if [ $flag -eq 1 ]
    then
    break
    fi
    let c=$a+$b
    if [ $(( $c-$lastFib )) -gt 1 ]
    then
    for (( j=lastFib+1; j<c; j++ ))
    do
        if [ $j -gt $max ]
        then
        flag=1
        break
        fi
        echo -ne $j",  "
    done
    fi
    a=$b
    b=$c
    let lastFib=$c 
done
echo -e "\n"

现在,我继续使用递归方法实现了相同的逻辑。

以下是Recusive Implementation:

clear

nonfib()
{
    let c=$a+$b
    if [ $(( $c-$lastFib )) -gt 1 ]
    then
    for (( i=lastFib+1; i<c; i++ ))
    do
        if [ $i -gt $limit ]
        then
        flag=1
        break
        fi
        echo -ne $i" "
    done
    fi
    a=$b
    b=$c
    lastfib=$c
    if [ $flag -eq 1 ]
    then
    exit
    fi
    nonfib
}

if [ $# -ne 1 ]
then
    echo "Invalid Argument!!"
    exit
fi
a=0
b=1
flag=0
lastFib=0
c=0
limit=$1
echo "Non-Fibonacci Numbers : "
nonfib
echo -e"\n"

但是,这一行

if [ $(( $c-$lastFib )) -gt 1 ] 

未能按照我的预期行事。 它检查当前斐波那契数和最后生成的数之间的差异,以查看它们之间是否存在值。 但这就是执行失误的地方。

需要帮助。

修改

我运行了代码:sh -x NonFibRecursive.sh 10以检查错误。

这是输出:

Non-Fibonacci Numbers : 
1 1 2 1 2 3 4 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 9 10 [babi@localhost ShellScripts]$ sh -x NonFibRecursive.sh 10
+ clear
+ '[' 1 -ne 1 ']'
+ a=0
+ b=1
+ flag=0
+ lastFib=0
+ c=0
+ limit=10
+ echo 'Non-Fibonacci Numbers : '
Non-Fibonacci Numbers : 
+ nonfib
+ let c=0+1
+ '[' 1 -gt 1 ']'
+ a=1
+ b=1
+ lastfib=1
+ '[' 0 -eq 1 ']'
+ nonfib
+ let c=1+1
+ '[' 2 -gt 1 ']'
+ (( i=lastFib+1 ))
+ (( i<c ))
+ '[' 1 -gt 10 ']'
+ echo -ne '1 '
1 + (( i++  ))
+ (( i<c ))
+ a=1
+ b=2
+ lastfib=2
+ '[' 0 -eq 1 ']'
+ nonfib
+ let c=1+2
+ '[' 3 -gt 1 ']'
+ (( i=lastFib+1 ))
+ (( i<c ))
+ '[' 1 -gt 10 ']'
+ echo -ne '1 '
1 + (( i++  ))
+ (( i<c ))
+ '[' 2 -gt 10 ']'
+ echo -ne '2 '
2 + (( i++  ))
+ (( i<c ))
+ a=2
+ b=3
+ lastfib=3
+ '[' 0 -eq 1 ']'
+ nonfib
+ let c=2+3
+ '[' 5 -gt 1 ']'
+ (( i=lastFib+1 ))
+ (( i<c ))
+ '[' 1 -gt 10 ']'
+ echo -ne '1 '
1 + (( i++  ))
+ (( i<c ))
+ '[' 2 -gt 10 ']'
+ echo -ne '2 '
2 + (( i++  ))
+ (( i<c ))
+ '[' 3 -gt 10 ']'
+ echo -ne '3 '
3 + (( i++  ))
+ (( i<c ))
+ '[' 4 -gt 10 ']'
+ echo -ne '4 '
4 + (( i++  ))
+ (( i<c ))
+ a=3
+ b=5
+ lastfib=5
+ '[' 0 -eq 1 ']'
+ nonfib
+ let c=3+5
+ '[' 8 -gt 1 ']'
+ (( i=lastFib+1 ))
+ (( i<c ))
+ '[' 1 -gt 10 ']'
+ echo -ne '1 '
1 + (( i++  ))
+ (( i<c ))
+ '[' 2 -gt 10 ']'
+ echo -ne '2 '
2 + (( i++  ))
+ (( i<c ))
+ '[' 3 -gt 10 ']'
+ echo -ne '3 '
3 + (( i++  ))
+ (( i<c ))
+ '[' 4 -gt 10 ']'
+ echo -ne '4 '
4 + (( i++  ))
+ (( i<c ))
+ '[' 5 -gt 10 ']'
+ echo -ne '5 '
5 + (( i++  ))
+ (( i<c ))
+ '[' 6 -gt 10 ']'
+ echo -ne '6 '
6 + (( i++  ))
+ (( i<c ))
+ '[' 7 -gt 10 ']'
+ echo -ne '7 '
7 + (( i++  ))
+ (( i<c ))
+ a=5
+ b=8
+ lastfib=8
+ '[' 0 -eq 1 ']'
+ nonfib
+ let c=5+8
+ '[' 13 -gt 1 ']'
+ (( i=lastFib+1 ))
+ (( i<c ))
+ '[' 1 -gt 10 ']'
+ echo -ne '1 '
1 + (( i++  ))
+ (( i<c ))
+ '[' 2 -gt 10 ']'
+ echo -ne '2 '
2 + (( i++  ))
+ (( i<c ))
+ '[' 3 -gt 10 ']'
+ echo -ne '3 '
3 + (( i++  ))
+ (( i<c ))
+ '[' 4 -gt 10 ']'
+ echo -ne '4 '
4 + (( i++  ))
+ (( i<c ))
+ '[' 5 -gt 10 ']'
+ echo -ne '5 '
5 + (( i++  ))
+ (( i<c ))
+ '[' 6 -gt 10 ']'
+ echo -ne '6 '
6 + (( i++  ))
+ (( i<c ))
+ '[' 7 -gt 10 ']'
+ echo -ne '7 '
7 + (( i++  ))
+ (( i<c ))
+ '[' 8 -gt 10 ']'
+ echo -ne '8 '
8 + (( i++  ))
+ (( i<c ))
+ '[' 9 -gt 10 ']'
+ echo -ne '9 '
9 + (( i++  ))
+ (( i<c ))
+ '[' 10 -gt 10 ']'
+ echo -ne '10 '
10 + (( i++  ))
+ (( i<c ))
+ '[' 11 -gt 10 ']'
+ flag=1
+ break
+ a=8
+ b=13
+ lastfib=13
+ '[' 1 -eq 1 ']'
+ exit

这是问题的起点:让c = 1 + 1      '[' 2 -gt 1 ']'显示,2&gt; 1。 但怎么会有2个呢? CurrentFib = 2 LastFib = 1

所以,2-1 = 1。

我希望我能正确解释这个问题。 如果需要进一步说明,请询问。

更正代码:

clear

nonfib()
{
    let c=$a+$b
    if [ $(( $c-$lastFib )) -gt 1 ]
    then
    for (( i=lastFib+1; i<c; i++ ))
    do
        if [ $i -gt $limit ]
        then
        flag=1
        break
        fi
        echo -ne $i" "
    done
    fi
    a=$b
    b=$c
    lastFib=$c
    if [ $flag -eq 1 ]
    then
    echo
    exit
    fi
    nonfib
}

if [ $# -ne 1 ]
then
    echo "Invalid Argument!!"
    exit
fi
a=0
b=1
flag=0
lastFib=0
c=0
limit=$1
echo "Non-Fibonacci Numbers : "
nonfib

谢谢。 问候 Priyabrata

1 个答案:

答案 0 :(得分:2)

问题在于这一行:

lastfib=$c

应该是:

lastFib=$c
#   ^
# Capital F

bash中的变量名称区分大小写。