我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
phoenixzz
帖子: 110
注册时间: 2007-06-07 18:30

我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#1

帖子 phoenixzz » 2009-03-25 17:52

get_ans()
{
if [$1 -eq 1] ;then
return 1
elif [$1 -eq 2] ;then
return 1
else
return $(( get_ans $(($1-1)) + get_ans $(($1-2)) ))
fi
}

echo enter an integer

read t
b=get_ans $t
echo $b

这个程序运行的时候
我输入3
提示
./1.sh: line 15: 3:找不到命令

然后我改成

#echo enter an integer

#read t
b=get_ans $1
echo $b

在终端输入./1.sh 3
仍然提示./1.sh: line 15: 3:找不到命令

可是我看书上讲的给函数传递参数就是这样的阿,书上写的有一个双引号,但是我加上双引号之后仍然报错,请问是什么问题呢,还有阿,书上没有讲到有关函数递归,我这样写有没问题阿

高手帮帮忙,谢谢先
头像
xxdaystar
帖子: 225
注册时间: 2006-07-28 14:58
来自: 廣州

Re: 我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#2

帖子 xxdaystar » 2009-03-25 18:07

記得在 [ 和 ] 左右留空喔
头像
hamaburg
帖子: 284
注册时间: 2006-06-30 12:52

Re: 我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#3

帖子 hamaburg » 2009-03-25 18:36

bash 中空格要特别注意

还有 赋值时等号两边千万不能有空格
头像
phoenixzz
帖子: 110
注册时间: 2007-06-07 18:30

Re: 我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#4

帖子 phoenixzz » 2009-03-25 22:43

谢LS两位,我已经把空格加上了,但是仍然报错
我觉得主要问题有两个
一是函数参数传递与返回值赋值的格式是不是像我写的那样,书上好像也没怎么说明白
二是shell函数能不能递归
头像
c\nc
帖子: 231
注册时间: 2007-12-25 12:51

Re: 我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#5

帖子 c\nc » 2009-03-25 23:59

像 C 那样的返回值不行了,不过递归是可以的。
头像
xxdaystar
帖子: 225
注册时间: 2006-07-28 14:58
来自: 廣州

Re: 我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#6

帖子 xxdaystar » 2009-03-26 0:02

shell可以遞歸的,你這種寫法應該有問題
$(($1-1))

$1是字符串類型的吧,你可以把它提到外面用let來運算。
头像
xxdaystar
帖子: 225
注册时间: 2006-07-28 14:58
来自: 廣州

Re: 我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#7

帖子 xxdaystar » 2009-03-26 0:05

是我自己搞錯了,$(())裡面可以直接運算。
头像
xxdaystar
帖子: 225
注册时间: 2006-07-28 14:58
来自: 廣州

Re: 我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#8

帖子 xxdaystar » 2009-03-26 1:05

改成這樣是可以的。如果要把11~15合成一句也應該沒問題的,琢磨琢磨,不過合起來不好理解。

代码: 全选

     1	#!/bin/bash
     2	
     3	get_ans()
     4	{
     5	if [ $1 -eq 1 ] ;then
     6		return 1
     7	elif [ $1 -eq 2 ] ;then
     8		return 1
     9	else
    10	
    11	get_ans $(($1-1)) 
    12		 a=$?
    13	get_ans $(($1-2))
    14	     b=$?
    15	return $(( a  + b ))
    16	
    17	fi
    18	}
    19	
    20	
    21	echo enter an integer
    22	
    23	read t
    24	get_ans $(($t)) 
    25	echo $?
注意一下bash的返回值,一般只作為判斷真假用,並不是c或java那樣用來傳遞數值。
头像
phoenixzz
帖子: 110
注册时间: 2007-06-07 18:30

Re: 我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#9

帖子 phoenixzz » 2009-03-26 14:26

谢LS
我大致明白了一些了
只是按照您给的程序还是不能求出想要的结果,可能是在递归调用函数的时候之后的结果覆盖了之前的a和b的值
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 我最近学习SHELL程序设计,遇到一个问题,请大家帮忙看看

#10

帖子 aerofox » 2009-03-26 23:23

代码: 全选

#!/bin/bash

get_ans()
{
    if [ $1 -eq 1 ] ;then
       echo 1
    elif [ $1 -eq 2 ] ;then
       echo 1
    else
       echo $(( `get_ans $(($1 - 1 ))` +  `get_ans $(( $1 - 2 ))` ))
    fi
}

echo enter an integer
read t
get_ans $(($t))
回复