LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 680|回复: 4

为什么case中执行function不work?

[复制链接]
发表于 2004-5-4 01:22:27 | 显示全部楼层 |阅读模式

  1. #!/bin/sh

  2. read -p "Specify your action? [create[c]|edit[e]] " act
  3. case $act in
  4. [cC][rR][eE][aA][tT][eE]|c ) create_prf;;
  5. [eE][dD][iI][tT]|e ) edit_prf;;
  6. esac

  7. function edit_prf
  8. {
  9. read -p "Please type your profile name: " prfname
  10. [ $(echo $prfname | grep " ") ] && echo "multiple results found. Please specify the profile name more precisely." && exit 1
  11. }
复制代码


code还没有写完,但就测试这么几行时,出现报错:
Specify your action? [create[c]|edit[e]] e
./mkprf: line 6: edit_prf: command not found
我将edit_prf换成ls,又能执行. 是不是case结构中不能引用function呢?如何才能work呢? XX
发表于 2004-5-4 01:46:16 | 显示全部楼层
把函数的定义放在case块前面。
虽然函数的优先级比命令要高,但执行case块时函数未定义,故报错。对于常用的函数,可以放在一个单独的脚本中定义,在调用的脚本里source亦可,典型的例子如发行版本的启动脚本
发表于 2004-5-4 01:47:56 | 显示全部楼层
  1. #!/bin/sh
  2. #
  3. function edit_prf {
  4. echo -n "Please type your profile name: " ;read prfname
  5.        [ $(echo $prfname | grep " ") ] && echo "multiple results found. Please specify the profile name more
  6. precisely." && exit 1
  7. }
  8. echo -n "Specify your action? [create[c]|edit[e]] ";read act
  9. case $act in
  10. [cC][rR][eE][aA][tT][eE]|c ) create_prf;;
  11. [eE][dD][iI][tT]|e ) edit_prf;;
  12. esac
复制代码

一般来将,都要在脚本的头部定义函数!这个可以
ps:你的shell是bash的把,我对bash的read不是很熟悉,
 楼主| 发表于 2004-5-4 02:35:44 | 显示全部楼层
哦, 原来时这样. bash原来不能向下查询脚本的内部函数, 感觉有点缺陷阿. 放到source倒是一个很好的思想,就象C中调用#include一样.To Javalee 兄: 原脚本在kch下, read语法是 'read var?"string"'.我怕有些兄弟看不明白,就换成了bash的了.
发表于 2004-5-4 02:41:27 | 显示全部楼层
read var?"....."是比较流行的写法,(ksh_)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表