免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: GM
打印 上一主题 下一主题

红袖添香:续问.......!!!!! [复制链接]

论坛徽章:
0
91 [报告]
发表于 2003-03-12 22:18 |只看该作者

红袖添香:续问.......!!!!!

红袖好:
呵呵,他也有可能帮不上忙喔,否则他跑的这么快,这个问题我看得有点悬,相信你能解答的!!!!,我期盼啊!!!

论坛徽章:
0
92 [报告]
发表于 2003-03-12 22:50 |只看该作者

红袖添香:续问.......!!!!!

原帖由 "GM" 发表:
红袖好:
呵呵,他也有可能帮不上忙喔,否则他跑的这么快,这个问题我看得有点悬,相信你能解答的!!!!,我期盼啊!!!



呵呵,开头不是他写的,看起来肯定有点晕。别说他了,我自己现在都有点头昏脑胀~~~ ,问题的困难之处就是 引号,还有变量的展开,还有你说的 while read 之处,有点怀疑是不是容易得解了……

论坛徽章:
0
93 [报告]
发表于 2003-03-12 22:56 |只看该作者

红袖添香:续问.......!!!!!

红袖好:
我相信你肯定能解的,你对awk,sed等这么熟,你能不能换种方式,试试,对不起,你是帮助我的,我好象又给你出作业了,真是不好意思啊,但是我很想能把这个问题给解开了,真的真的,要不然,我和你近的话,我要请客了,呵呵!!!

论坛徽章:
0
94 [报告]
发表于 2003-03-13 00:03 |只看该作者

红袖添香:续问.......!!!!!

...

我尽力吧,不过现在脑子乱乱的,放一下先,先看看其它的帖子。

有一点,不要对我太寄希望呀~~

其它高人,也请帮帮忙,如果你们有好主意的话。

论坛徽章:
0
95 [报告]
发表于 2003-03-13 08:38 |只看该作者

红袖添香:续问.......!!!!!

...

搞懂你的意图了,你是想,

1、询问是否备份
2、如果回答y就继续进行, n的话,中止
3、接下来还要问是否成功,不成功还要清理一下

所以简单的顺序用两次 yesno 不行,那样的话,即使第一个回答不做备份,也会在第二个中问备份成功吗,所以不行,于是你就想到把它们嵌套起来。

很可惜,那样子本身不行,因为,-c 后面的都是参数,是设计成用逗号分开的列表,夹杂一个 yesno,还带有很多变量,就完全打乱了参数的格式,所以行不通。

还好,找到了变通的方式。

修改一下原来的子程序(只需一处)

  1. yesno() {
  2.   printf "$1 "
  3.   while read reply; do
  4.     case $reply in
  5.       y|Y)
  6.         if [ "x$2" != "x-r"  ]; then
  7.             shift
  8.             cmd $*
  9.         fi
  10.         break;;
  11.       n|N)
  12.         if [ "x$2" = "x-r"  ]; then
  13.             shift 2
  14.             cmd $*
  15.         fi
  16.         exit 1;;         <==========================  [ break 改成exit 1 ]
  17.        *) printf "You should type \"y\" or \"n\" [y/n] "
  18.         continue ;;
  19.     esac
  20.   done
  21. }
复制代码



调用的方式不用嵌套,而是用 cmd1 && cmd2 这种形式,我用不同的颜色表示命令的域,好认一点,

yesno "今天要备份吗?...........................[y/n]" -c '
mkdir databak,
cd databak,
备份命令'
&& yesno "备份成功吗?...................[y/n]" -r -c '
rm -r databak,
echo "已删除备份目录,查正后再做........." ,
exit'



完全可以达到你的目的,试试看吧。

(要注意的是,因为你有一些 echo "..." 的语句, -c 后面的参数,采用外层用单引号,内层用双引号比较好,不容易出错)

论坛徽章:
0
96 [报告]
发表于 2003-03-14 12:58 |只看该作者

红袖添香:续问.......!!!!!

红袖好:
谢谢你为我找办法,辛苦了。
我的分析是这样的:
你采用的办法一般行的通,如是对最后一个命令的判断,倒还是行的通。要是有另一种情况,就有点麻烦了。
如:备份命令之后,进行判断正确如何,如何正确之后还要执行一些命令,例如后台拷磁带等。所以这种情况是备份命令后还有命令,只不过在备份命令之后
根据情况设了一个断点嵌套,如果备份不正确,就会不光中止这个循环,还会中止整个shell。
呵呵,是不是我做得有点烦了,这可能对函数做不到,因为函数中有一些变量,要是嵌套执行第二次的话,可能会搞乱函数内的变量。
所以,这样最好不采用函数,而是用一般的循环判断。你认为呢???


[/code]

论坛徽章:
0
97 [报告]
发表于 2003-03-15 09:47 |只看该作者

红袖添香:续问.......!!!!!

红袖好:
我还是想不明白,为什么会是这样呢?,今天我还是试了一下,也找到了原因之所在,但不知是什么道理,你再给我分析一下,包括我前一帖的问题,谢谢!!!我在你两个函数后面加了一个简单的判断函数,取名叫noyes()吧!


  1. noyes() {
  2.   read yy
  3.     case $yy in
  4. y|Y) break;;
  5. n|N) exit 1;;
  6. *) echo "yy变量没有读入......."
  7.     esac
  8. }
复制代码

yesno "今天要备份吗?...........................[y/n]" -c '
cal,
noyes,
echo "已删除备份目录,查正后再做........."'
date
经测试,也不是函数经嵌套之后变量被搞乱了,而是最根本的原因是在函数noyes()中的read yy没有执行或没有正确地读入,这是什么原因呢,何解呢,希望你能告诉我,谢了......!!!!

论坛徽章:
0
98 [报告]
发表于 2003-03-17 23:47 |只看该作者

红袖添香:续问.......!!!!!

...

noyes() {
read yy
   case $yy in
   y|Y) break;;
   n|N) exit 1;;
   *) echo "$yy not read......."
     esac
}

     yesno "backup...........................[y/n]" -c '
     cal,
     noyes,
     echo "ok........."'
     date


把你的子函数稍稍改一下,就可以检查出问题在什么地方了,运行结果,

# sh yesno.sh
backup...........................[y/n] y
--------------- excute command cal ---------------
   March 2003
S  M Tu  W Th  F  S
                   1
2  3  4  5  6  7  8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
--------------- excute command noyes ---------------
echo "ok........." not read.......
Mon Mar 17 16:32:57 MET 2003

蓝色这句正好是 noyes 的下一个命令。因为 noyes 中有一个 read 命令,它将等待第一个回车,所以得到这个结果也是自然的了。不过这还真能把人绕糊涂了,呵呵。


不过,你要达到的目的,也不是没有希望,不需要作什么大的变动,也是可以用的。看看下面的用法


  1. yesno() {
  2.   printf "$1 "
  3.   while read reply; do
  4.     case $reply in
  5.       y|Y)
  6.         if [ "x$2" != "x-r"  ]; then
  7.             shift
  8.             cmd $*
  9.         fi
  10.         break;;
  11.       n|N)
  12.         if [ "x$2" = "x-r"  ]; then
  13.             shift 2
  14.             cmd $*
  15.         fi
  16.         return 1;;       <========================  修改!================
  17.        *) printf "You should type \"y\" or \"n\" [y/n] "
  18.         continue ;;
  19.     esac
  20.   done
  21. }

  22. # 调用的方法,
  23. yesno "1. hehe....[y/n]" -c 'date'
  24. if [ $? -eq 0 ]; then
  25.     yesno "2. hehe....[y/n]" -c 'date'
  26.     if [ $? -eq 0 ]; then
  27.        yesno "3. hehe....[y/n]" -c 'date'
  28.        if [ $? -eq 0 ]; then
  29.            yesno "4. hehe....[y/n]" -c 'date'
  30.            if [ $? -eq 0 ]; then
  31.               yesno "5. hehe....[y/n]" -c 'date'
  32.            else
  33.               yesno "5. hihi....[y/n]" -c 'date'
  34.            fi
  35.            yesno "4. hihi....[y/n]" -c 'date'
  36.            command1
  37.            command2
  38.        fi
  39.        yesno "3. hihi....[y/n]" -c 'date'
  40.     fi
  41.     command1
  42.     command2
  43. else
  44.     yesno "1. hihi....[y/n]" -c 'date'
  45. fi
复制代码

论坛徽章:
0
99 [报告]
发表于 2003-03-18 13:34 |只看该作者

红袖添香:续问.......!!!!!

红袖好:
我只有半点明白,蓝色这句echo "ok.........."在屏幕上好象没有显示出来,我上次试的时候真的没注意到,是不是在函数noyes()中的read中当回车用了???
还有在你代码中的调用方法中,if用的太多了,使我真的有点绕糊涂了,能不能根据下面的代码给我示范一下好吗!!!

  1. yesno "今天要备份吗?...........................[y/n]" -c '
  2. mkdir databak,
  3. cd databak,
  4. 备份命令,
  5. yesno "备份成功吗?...................[y/n]" -r -c '
  6. rm -r databak,
  7. echo "已删除备份目录,查正后再做........." ,
  8. exit ' '
  9. 其它命令 .....
复制代码

还有一点假如备份成功的话,还要怎样加入后台进程拷磁带,如果这样又要怎样写呢?

论坛徽章:
0
100 [报告]
发表于 2003-03-19 09:31 |只看该作者

红袖添香:续问.......!!!!!

...

我是想让你自己多试试几个调用, 可能就知道怎么回事了, 没想到是反效果, 呵呵.

(因为你在回答 N 之后还有退出等不同动作,所以 yesno() 又稍微更动了一下)

  1. yesno() {
  2.   printf "$1 "
  3.   while read reply; do
  4.     case $reply in
  5.       y|Y)
  6.         if [ "x$2" != "x-r"  ]; then
  7.             shift
  8.             cmd $* && return 0
  9.         else
  10.             return 1
  11.         fi

  12.         ;;
  13.       n|N)
  14.         if [ "x$2" = "x-r"  ]; then
  15.             shift 2
  16.             cmd $* && return 0
  17.         else
  18.             return 2
  19.         fi
  20.         ;;
  21.        *) printf "You should type \"y\" or \"n\" [y/n] "
  22.         continue ;;
  23.     esac
  24.   done
  25. }



  26. yesno "今天备份吗? ...........................[y/n]" -c '
  27. mkdir databak,
  28. cd databak,
  29. echo "backup command"'

  30. if [ $? -eq 0 ]; then
  31.    yesno "备份成功吗? ...................[y/n]" -r -c '
  32.    echo "备份失败,正在清除……",
  33.    rm -r databak,
  34.    echo "deleting databak........." ,
  35.    exit
  36.    '

  37.    if [ $? -eq 1 ]; then
  38.       echo "备份备份成功!"
  39.       考磁带命令
  40.    fi

  41. fi

  42. echo "其它命令"
复制代码


这样能不能够满足你的要求?其实你要再加上更多的条件判断道理也是一样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP